Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Channel API Presence not triggering

I'm trying to handle disconnect / connect states using Presence in the Channel API.

Here are some of my code.

app.yaml

handlers: - url: /(.*\.(gif|png|jpg|ico|js|css))   static_files: \1   upload: (.*\.(gif|png|jpg|ico|js|css))  - url: .*   script: main.py  inbound_services: - channel_presence 

main.py

class onConnect(webapp.RequestHandler):   def post(self):     for user in users:       users = User.all().fetch(1000)       client = client_id = self.request.get('from')       channel.send_message(user.channel,' connected');  class onDisconnect(webapp.RequestHandler):   def post(self):     Mainpage()     for user in users:       users = User.all().fetch(1000)       client = client_id = self.request.get('from')       channel.send_message(user.channel, ' disconnected');  application = webapp.WSGIApplication(                                      [('/', MainPage),                                      ('/_ah/channel/connected/',onConnect),                                      ('/_ah/channel/disconnected/',onDisconnect),                                      ('/chat',handleChat)],                                      debug=True) 

Javascript

<script>         openChannel = function(){             var token = '{{ token }}';             var channel = new goog.appengine.Channel(token);             var handler = {                   'onopen': onOpened,                   'onmessage': onMessage,                   'onerror': function() {},                   'onclose': function() {}                 };             var socket = channel.open(handler);             socket.onopen = onOpened;             socket.onmessage = onMessage;              var chat = document.getElementById('chatinput');                 chat.onkeyup = function(e){                     if(e.keyCode == 13){                         sendChat(this.value);                         this.value = '';                     }                 }         }          sendMessage = function(path, opt_param) {             if (opt_param) {                 path += '?' + opt_param;             }             var xhr = new XMLHttpRequest();             xhr.open('POST', path, true);             xhr.send();         };          onOpened = function(){             console.log('Channel Opened');               var chatlog = document.getElementById('chatlog');             var msg = document.createElement('div');                 msg.innerHTML = 'Channel Opened';                 chatlog.appendChild(msg);             sendMessage('/chat','m='+'A User Joined.');         }          onMessage = function(m){             console.log('Message Recieved');             var chatlog = document.getElementById('chatlog');             var msg = document.createElement('div');             var d = new Date();                 msg.innerHTML = d.toLocaleTimeString() + ': ' + m.data;                 chatlog.appendChild(msg);         }          sendChat = function(msg){             console.log(msg);             sendMessage('/chat','m='+msg);         }          openChannel();     </script> 

Using this code, connnect and disconnect is not triggering when a user closes their browser or whatever.

Are there anything wrong with this code?

like image 473
AlexCheuk Avatar asked Apr 14 '12 09:04

AlexCheuk


1 Answers

Yes, route list is wrong. Put ('/', MainPage) in the end of the routes list. From webapp2 URI routing guide:

When the application receives a request, it tries to match each one in order until one matches, and then call the corresponding handler.

like image 93
Alex Dvoretsky Avatar answered Sep 19 '22 14:09

Alex Dvoretsky