[MERGE] xmo chat update
bzr revid: al@openerp.com-20110413020425-h3xdyrgf8qpj3trg
This commit is contained in:
commit
92a0889230
|
@ -2,7 +2,7 @@
|
|||
import sys, time
|
||||
|
||||
import simplejson
|
||||
|
||||
import random
|
||||
import openerpweb
|
||||
|
||||
#----------------------------------------------------------
|
||||
|
@ -11,23 +11,32 @@ import openerpweb
|
|||
class PollServerMessageQueue(object):
|
||||
def __init__(self):
|
||||
# message queue
|
||||
self.l = []
|
||||
self.messages = []
|
||||
# online users
|
||||
self.users = {}
|
||||
# should contains: {
|
||||
# 'user1234' : { s:1, m:"status message", timestamp: last_contact_timestamp }
|
||||
# }
|
||||
def userlist():
|
||||
# return user list
|
||||
pass
|
||||
def userlist(self, req):
|
||||
userlist = [users for users in req.applicationsession['users']]
|
||||
|
||||
# userlist = [
|
||||
# {"u": "Guest130205108745.47", "s": {"s": 1, "m": ""}, "g": "Users"},
|
||||
# {"u": "Guest130209838956.76", "s": {"s": 1, "m": ""}, "g": "Users"},
|
||||
# ]
|
||||
|
||||
def write(self, m_type, m_sender, m_recipent, m_message, m_group):
|
||||
# appends messages to l
|
||||
# when status message uupdate users
|
||||
pass
|
||||
def read(self, recpient, timestamp):
|
||||
# return matching message
|
||||
return userlist
|
||||
|
||||
def write(self, m_type, m_from, m_to, m_message, m_group):
|
||||
self.messages.append({'type': m_type, 'from': m_from, 'to': m_to, 'message': m_message, 'group': m_group})
|
||||
# when status message update users
|
||||
pass
|
||||
|
||||
def read(self, recipient, timestamp):
|
||||
for msg in self.messages:
|
||||
if msg['to'] == recipient:
|
||||
return self.messages
|
||||
|
||||
def gc():
|
||||
# remove message older than 300s from self.l
|
||||
# remove dead users from self.users
|
||||
|
@ -38,6 +47,7 @@ class PollServer(openerpweb.Controller):
|
|||
|
||||
@openerpweb.httprequest
|
||||
def login(self, req, **kw):
|
||||
|
||||
"""
|
||||
--> POST http://ajaxim.com/wp-content/plugins/im/ajaxim.php/login
|
||||
Form Data
|
||||
|
@ -56,21 +66,33 @@ class PollServer(openerpweb.Controller):
|
|||
]
|
||||
}
|
||||
"""
|
||||
mq = req.applicationsession.setdefault("web_chat",PollServerMessageQueue())
|
||||
print "chat login",kw
|
||||
# r = 'loggued in'
|
||||
mq = req.applicationsession.setdefault("web_chat", PollServerMessageQueue())
|
||||
mq.messages = []
|
||||
|
||||
#r = 'logged in'
|
||||
#u = generate random.randint(0,2**32)
|
||||
#s = cherrypy cookie id
|
||||
#f = mq.userlist()
|
||||
return """
|
||||
|
||||
# username = 'Guest'+ str(random.randint(0, 2**32))
|
||||
#
|
||||
# if not req.applicationsession.get('users'):
|
||||
# req.applicationsession['users'] = [{'u': username, 's':{'s':1, 'm':''}, 'g':'Users'}]
|
||||
# else:
|
||||
# req.applicationsession['users'].append({'u': username, 's':{'s':1, 'm':''}, 'g':'Users'})
|
||||
req.applicationsession['users'] = [{'u': 'Guest1', 's':{'s':1, 'm':'111'}, 'g':'Users'},
|
||||
{'u': 'Guest2', 's':{'s':1, 'm':'222'}, 'g':'Users'},
|
||||
{'u': 'Guest3', 's':{'s':1, 'm':'333'}, 'g':'Users'}]
|
||||
|
||||
# Temporary Guest1 is my current user
|
||||
req.applicationsession['current_user'] = 'Guest1'
|
||||
|
||||
return """
|
||||
{
|
||||
"r":"logged in",
|
||||
"u":"Guest130213866190.85",
|
||||
"u":'Guest1',
|
||||
"s":"f9e1811536f19ad5b9e00376f9ff1532",
|
||||
"f":[
|
||||
{"u":"Guest130205108745.47","s":{"s":1,"m":""},"g":"Users"},
|
||||
{"u":"Guest130209838956.76","s":{"s":1,"m":""},"g":"Users"},
|
||||
]
|
||||
"f":""" + str(mq.userlist(req)) + """
|
||||
}
|
||||
"""
|
||||
|
||||
|
@ -83,6 +105,11 @@ class PollServer(openerpweb.Controller):
|
|||
|
||||
@openerpweb.httprequest
|
||||
def poll(self, req, **kw):
|
||||
|
||||
mq = req.applicationsession.setdefault("web_chat", PollServerMessageQueue())
|
||||
|
||||
# Method: Long Poll
|
||||
|
||||
"""
|
||||
--> GET http://im.ajaxim.com/poll?callback=jsonp1302138663582&_1302138663582=
|
||||
<-- 200 OK
|
||||
|
@ -98,30 +125,35 @@ class PollServer(openerpweb.Controller):
|
|||
jsonp1302140441577([{"t":"s","s":"Guest130214038974.31","r":"","m":"0:"}]);
|
||||
|
||||
receive message:
|
||||
jsonp1302140191599([{"t":"m","s":"Guest130214008855.5","r":"Guest130214013134.26","m":"fuck"}]);
|
||||
jsonp1302140191599([{"t":"m","s":"Guest130214008855.5","r":"Guest130214013134.26","m":"xxxxxx"}]);
|
||||
|
||||
('t' => $msg->type, 's' => $msg->from, 'r' => $msg->to, 'm' => $msg->message )
|
||||
mag type s or m
|
||||
echo '<script type="text/javascript">parent.AjaxIM.incoming('. json_encode($this->_pollParseMessages($messages)) . ');</script>'
|
||||
|
||||
|
||||
"""
|
||||
# for i in range(60):
|
||||
#r = mq.read(username,timestamp)
|
||||
# if messages
|
||||
# return r
|
||||
# if no message sleep 2s and retry
|
||||
# sleep 2
|
||||
# else
|
||||
# return emptylist
|
||||
print "chat poll",kw
|
||||
time.sleep(2)
|
||||
# it's http://localhost:8002/web_chat/pollserver/poll?method=long?callback=jsonp1302147330483&_1302147330483=
|
||||
return '%s([{"t":"m","s":"Guest130214008855.5","r":"Guest130214013134.26","m":"fuck"}]);'%kw.get('callback','')
|
||||
return None
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
|
||||
msg = '[]'
|
||||
|
||||
for i in range(5):
|
||||
received_msg = mq.read('Guest1', i)
|
||||
if received_msg:
|
||||
msg = self._pollParseMessages(received_msg)
|
||||
mq.messages = []
|
||||
return '%s'%kw.get('callback', '') + '(' + str(msg) + ');'
|
||||
else:
|
||||
msg = '[]'
|
||||
time.sleep(2)
|
||||
return '%s'%kw.get('callback', '') + '(' + str(msg) + ');'
|
||||
|
||||
@openerpweb.httprequest
|
||||
def send(self, req, **kw):
|
||||
|
||||
to = kw.get('to')
|
||||
message = kw.get('message')
|
||||
|
||||
mq = req.applicationsession.setdefault("web_chat", PollServerMessageQueue())
|
||||
|
||||
"""
|
||||
--> GET http://im.ajaxim.com/send?callback=jsonp1302139980022&to=Guest130205108745.47&message=test&_1302139980022=
|
||||
callback: jsonp1302139980022
|
||||
|
@ -138,12 +170,23 @@ class PollServer(openerpweb.Controller):
|
|||
return array('r' => 'error', 'e' => 'send error');
|
||||
|
||||
"""
|
||||
print "chat send",kw
|
||||
# mq.write()
|
||||
return {"action": actions}
|
||||
|
||||
if not req.applicationsession['current_user']:
|
||||
return dict(r='error', e='no session found')
|
||||
|
||||
if not to:
|
||||
return dict(r='error', e='no_recipient')
|
||||
|
||||
if message:
|
||||
mq.write(m_type="m", m_from=req.applicationsession['current_user'], m_to=to, m_message=message, m_group="Users")
|
||||
return '%s'%kw.get('callback', '') + '(' + simplejson.dumps({'r': 'sent'}) + ')'
|
||||
else:
|
||||
return {'r': 'error', 'e': 'send error'}
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
@openerpweb.httprequest
|
||||
def status(self, req, **kw):
|
||||
mq = req.applicationsession.setdefault("web_chat", PollServerMessageQueue())
|
||||
|
||||
"""
|
||||
--> GET status call
|
||||
const Offline = 0;
|
||||
|
@ -158,8 +201,18 @@ class PollServer(openerpweb.Controller):
|
|||
return array('r' => 'error', 'e' => 'no session found');
|
||||
return array('r' => 'error', 'e' => 'status error');
|
||||
"""
|
||||
print "chat status",kw
|
||||
print "======== chat status ========",kw
|
||||
# mq.write()
|
||||
return {"action": actions}
|
||||
return {"action": ""}
|
||||
|
||||
def _pollParseMessages(self, messages):
|
||||
msg_arr = []
|
||||
for msg in messages:
|
||||
msg_arr.append({"t": str(msg['type']), "s": str(msg['from']), "r": str(msg['to']), "m": str(msg['message'])})
|
||||
|
||||
return msg_arr
|
||||
|
||||
def _sanitize(self, message):
|
||||
return message.replace('>', '>').replace('<', '<').replace('&', '&');
|
||||
|
||||
|
||||
|
|
|
@ -1,21 +0,0 @@
|
|||
|
||||
import im
|
||||
from server import main # import the server library
|
||||
|
||||
im = Webchat_IM()
|
||||
action = preg_replace('/^' . preg_quote($_SERVER['SCRIPT_NAME'], '/') . '\/(.+?)(\?.+)?$/', '\1', $_SERVER['REQUEST_URI']);
|
||||
|
||||
if(substr(action, 0, 1) != '_' && method_exists(im, action))
|
||||
if(action == 'poll') {
|
||||
if($_GET['method'] == 'comet') {
|
||||
im->poll('comet');
|
||||
} else {
|
||||
print $_GET['callback'] . '(' . json_encode(im->poll($_GET['method'])) . ')';
|
||||
}
|
||||
} else {
|
||||
execute = call_user_func_array(array(im, action), $_POST);
|
||||
if(execute)
|
||||
print json_encode(execute !== false ? execute : array('e'=>'wrong args'));
|
||||
}
|
||||
else
|
||||
print json_encode(array('e'=>'no method'));
|
|
@ -1,22 +0,0 @@
|
|||
|
||||
import openerpweb
|
||||
|
||||
class IM(openerpweb.Controller):
|
||||
def __init__(self):
|
||||
super(IM, self).__init__()
|
||||
return;
|
||||
|
||||
def chat_login(self, username, password):
|
||||
return dict()
|
||||
|
||||
def chat_logout(self):
|
||||
return dict()
|
||||
|
||||
def send(self):
|
||||
return dict()
|
||||
|
||||
def status(self, status, message):
|
||||
return dict()
|
||||
|
||||
def poll(self, method):
|
||||
return dict()
|
|
@ -1,61 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
import simplejson
|
||||
import openerpweb
|
||||
|
||||
from web_chat.controllers import im
|
||||
|
||||
__all__ = ['Webchat_IM']
|
||||
|
||||
chat_config_options = {'IM_LIBRARY': 'main', # The IM server library.
|
||||
'COOKIE_NAME': 'ajaxim_session', # Session cookie used by Ajax IM
|
||||
'COOKIE_PERIOD': 365 # Cookie period, in days
|
||||
}
|
||||
|
||||
nodejs_memcache_server = ['localhost:11211']
|
||||
|
||||
class Webchat_IM(im.IM):
|
||||
|
||||
_cp_path = "/webchat/webchatim"
|
||||
|
||||
def __init__(self):
|
||||
super(Webchat_IM, self).__init__()
|
||||
|
||||
return;
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def index(self, req, username="admin", password="admin"):
|
||||
|
||||
if req._login:
|
||||
self.username = req._login
|
||||
self.uid = req._uid
|
||||
self.db = req._db
|
||||
|
||||
return;
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def chat_login(self, req, username="admin", password="admin"):
|
||||
# TODO: use db and uid for unique identification.
|
||||
|
||||
self.auth = [['admin', 'a'], ['demo', 'demo']]
|
||||
|
||||
self.user_pass = []
|
||||
self.user_session = None
|
||||
|
||||
if username and password:
|
||||
self.user_pass = [username, password]
|
||||
|
||||
if self.user_pass in self.auth:
|
||||
self.user_session = username + '_' + str(req.session_id)
|
||||
|
||||
data = {'username': username, 'user_id': username, 'user_session': self.user_session,
|
||||
'friends': {'u': 'demo', 'g': 'Friends', 's': '1'} # {'u': 'username', 'g': 'group', 's': 'status'}
|
||||
}
|
||||
|
||||
# Get the list of friends from memcache.
|
||||
|
||||
return dict(r='logged in', s=self.user_session, f=data['friends'])
|
||||
|
||||
@openerpweb.jsonrequest
|
||||
def chat_logout(self):
|
||||
return dict(r='Logged out')
|
File diff suppressed because one or more lines are too long
|
@ -1,3 +1,4 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<script type="text/javascript" src="/web_chat/static/lib/AjaxIM/js/jquery-1.3.2.js"></script>
|
||||
|
|
Loading…
Reference in New Issue