[MERGE] xmo chat update

bzr revid: al@openerp.com-20110413020425-h3xdyrgf8qpj3trg
This commit is contained in:
Antony Lesuisse 2011-04-13 04:04:25 +02:00
commit 92a0889230
7 changed files with 2198 additions and 148 deletions

View File

@ -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('>', '&gt;').replace('<', '&lt;').replace('&', '&amp;');

View File

@ -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'));

View File

@ -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()

View File

@ -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

View File

@ -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>