[Python-es] Chatear con una maquina!

Diego Uribe Gamez diego.uribe.gamez en gmail.com
Mie Ago 15 23:11:34 CEST 2012


mmmm Disculpen que no me hice entender, voy a hablar a nivel de código y me
voy a enfocar en el proyecto que mencione al principio, la razón de hacerlo
de esta manera que la forma en la que funciona y el problema como la
solución para mi proyecto esta en usar jason y Gevent, porque las consultas
van a ser muchas y este sistema de combinado hace que la pagina chatee con
la maquina sin gastar muchos recursos.

Mi problema es en acondicionar este proyecto a la idea como tal de chatear
con una maquina, me gusta es que tengo mucho del código a la mano y la idea
es adaptarme.

El código actual:
-----------------------------------------------------------------------
# Datos para la conexion al Socket y la IP que escucharemos
host = '190.145.XXX.XXX'
port = 33XX
buf = 102400
addr = (host, port)
# Creamos el Socket - (INTERNET,UDP)
UDPSock = socket(AF_INET,SOCK_DGRAM)
UDPSock.bind(addr)
# Bucle infinito (PROBLEMA)
while 1:
    # recibir data
    data,addr = UDPSock.recvfrom(buf)
-----------------------------------------------------------------------
Nota: Resulta que yo estoy usando este código para capturar
la información que me envían a mi ip y puerto, el problema es que estoy
usando un bucle infinito para hacerlo y creo que esta mal, adicional
necesitaba que apenas llegara algun dato poder mostrarselo al usuario en la
pantalla, pensando en una solución me encontré con este proyecto y su demo
que es un chat(en python, gevent, jason y javascript), donde para mi una
solución es poder chatear con la maquina o mejor dicho es que apenas la
maquina se comunique la idea es que el usuario pueda ver la información en
tiempo real en la pagina web sin necesidad de recargar la pagina.

En el código a continuación yo entiendo muchas cosas pero no estoy seguro
de como adaptar mi código actual a la solución del problema.

message_new() este se encarga de crear nuevos mensajes para los navegadores
usando create_message y lo retorna con un json_response

message_updates() dice que si no hay un mensaje en cache o que si el
mensaje del navegador(cursor) es igual al ultimo mensaje toca esperar a un
nuevo mensaje self.new_message_event.wait() para luego actualizar

Código del Chat:
-----------------------------------------------------------------------
import uuid
import simplejson
from django.shortcuts import render_to_response
from django.template.loader import render_to_string
from django.http import HttpResponse
from gevent.event import Event
import settings


class ChatRoom(object):
    cache_size = 200

    def __init__(self):
        self.cache = []
        self.new_message_event = Event()

    def main(self, request):
        if self.cache:
            request.session['cursor'] = self.cache[-1]['id']
        return render_to_response('index.html', {'MEDIA_URL':
settings.MEDIA_URL, 'messages': self.cache})

    def message_new(self, request):
        name = request.META.get('REMOTE_ADDR') or 'Anonymous'
        forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
        if forwarded_for and name == '127.0.0.1':
            name = forwarded_for
        msg = create_message(name, request.POST['body'])
        self.cache.append(msg)
        if len(self.cache) > self.cache_size:
            self.cache = self.cache[-self.cache_size:]
        self.new_message_event.set()
        self.new_message_event.clear()
        return json_response(msg)

    def message_updates(self, request):
        cursor = request.session.get('cursor')
        if not self.cache or cursor == self.cache[-1]['id']:
            self.new_message_event.wait()
        assert cursor != self.cache[-1]['id'], cursor
        try:
            for index, m in enumerate(self.cache):
                if m['id'] == cursor:
                    return json_response({'messages': self.cache[index +
1:]})
            return json_response({'messages': self.cache})
        finally:
            if self.cache:
                request.session['cursor'] = self.cache[-1]['id']
            else:
                request.session.pop('cursor', None)

room = ChatRoom()
main = room.main
message_new = room.message_new
message_updates = room.message_updates

def create_message(from_, body):
    data = {'id': str(uuid.uuid4()), 'from': from_, 'body': body}
    data['html'] = render_to_string('message.html', dictionary={'message':
data})
    return data

def json_response(value, **kwargs):
    kwargs.setdefault('content_type', 'text/javascript; charset=UTF-8')
    return HttpResponse(simplejson.dumps(value), **kwargs)
-----------------------------------------------------------------------

Esto un poco por encima lo entiendo, lo que no sabría es como adaptar
mi código actual a message_new?

Espero haberme hecho entender y ver si pueden darme una idea.

Gracias.


El 14 de agosto de 2012 19:20, Olemis Lang <olemis en gmail.com> escribió:

> On 8/14/12, Alexandro Colorado <jza en oooes.org> wrote:
> > Si hay sistemas sobre jabber donde puedes crear un chat de grupo estilo
> IRC
> > donde tus servidores se conecten al irse en linea y esten reportando
> cosas
> > originadas de dbus o eventos de tu servidor web.
> > Lo complicado seria la
> > pre-programacion para que puedas responderles con comandos para
> reiniciar,
> > depurar, o resumir procesos.
> >
> > Estos proyecgtos probablemente ya existen es solo de seguir buscando, el
> > detalle es saber que realmente quieres lograr.
> >
>
> a ver a ver ... si están hablando d XMPP algo debería aparecer por aquí
> http://xmpp.org/xmpp-protocols/xmpp-extensions/
>
> > 2012/8/14 Diego Uribe Gamez <diego.uribe.gamez en gmail.com>
> >
> >> Saludos, comunidad,
> >>
> >> Traigo este tema bastante interesante y es que quiero chatear con una
> >> maquina,
>
> d hecho , si somos más estrictos en realidad *SIEMPRE* las máquinas
> están chateando entre ellas , lo q de vez en cuando nos dejan ver unos
> byte-citos ... ;)
>
> hay muchos ejemplos de bots implementados sobre XMPP . Está Google
> guru , los ex-bots de Google Wave , ...
>
> [...]
>
> --
> Regards,
>
> Olemis.
>
> Blog ES: http://simelo-es.blogspot.com/
> Blog EN: http://simelo-en.blogspot.com/
>
> Featured article:
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>



-- 
 *Diego Alonso Uribe Gamez*
------------------------------

*Desarrollador web*

Twitter: @DiegoUG <http://www.twitter.com/DiegoUG>

Google+: http://gplus.to/diegoug
------------------------------
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20120815/72431856/attachment.html>


Más información sobre la lista de distribución Python-es