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?
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With