domingo, marzo 05, 2006

GoogleTalk Status

Actualización: Este material está obsoleto porque la nueva versión de Google Desktop permite obtener la posicón del mouse, lo cual puede usarse para detectar la inactividad del usuario.

Este es el caso: Me encanta Google Desktop Sidebar 3 y realizé un plugin para mi y mis compañeros de trabajo, el cual muestra información actualizada constantemente. El problema está en que mi PC está encendido 24/7 y no tiene ningun sentido que el plugin esté descargando datos desde internet para mostrarmelos si yo me fui a almorzar o estoy durmiendo. Entonces seria bueno que el plugin pueda de alguna forma determinar cuando no estoy utilizando el PC y en esos momentos no descargue la información acutalizada ahorrando así ancho de banda, consumo de la linea y procesamiento del servidor. Obviamente en mi
Google Desktop Sidebar tengo GoogleTalk conectado y él sí sabe cuando no estoy en el PC, entonces una idea seria preguntarle a él, pero hay un pequeño problema que explico a continuación:

La API de la Sidebar expone, entre otras, la variable global googleTalk la cual permite que el plugin se comunique con nuestros 'amigos' que también tengan instalada la Sidebar y el plugin en cuestion. googleTalk tiene la propiedad friends que es un arreglo de objectos Friend, con ella podemos saber el estado (online/idle/busy) de nuestros amigos.
Nota: friends solo expone nuestros amigos que están online, los que estan offline no aparecerán en el arreglo.

El problema está en que si bien podemos saber el status de nuestros amigos, no hay forma de saber nuestro propio status, entonces se me ocurrio lo más obvio: Si no podemos saberlo pero nuestros amigos sí, preguntemoselo a ellos!

Como funciona

La idea es simple, le pregunta periodicamente a mis amigos indicados en options.GetValue('googleTalkStatus_friends') siempre y cuando options.GetValue('check_my_status') == 'true'. Luego, cuando mi estado cambia llama googleTalkStatus.onChangeStatus.

Entonces, para que funcione, el plugin se debe encargar de alguna manera que el usuario especifique cuales de sus amigos tienen el plugin instalado; esto parecerá una molestia pero me vi forzado a incluirlo para evitar que cada medio minuto a mis amigos les apareciera una ventana preguntando si quieren entrar a la página de plugins de Google Desktop Sidebar porque no tienen instalado el plugin que estoy usando.
googleTalkStatus_friends debe ser la representación literal de un arreglo con los nombres de los amigos selecionados, ej: googleTalkStatus_friends = ['Juan Perez', 'Kaiser Soza'].

Como se usa

googleTalkStatus tiene cuatro propiedades posiblemente utiles para el plugin y tan solo dos metodos. Hay otras propiedades y metodos pero son de uso interno y no son de mucha utilidad para el plugin.

Propiedades:
googleTalkStatus.status: indica mi estado de GoogleTalk, estos pueden ser: 'firstCheck', 'unknown', 'stopped' y 0, 1, 2 para Online, Idle y Busy respectivamente. firstCheck es el estado que existe entre la llamada a googleTalkStatus.start() y la primera respuesta de mis amigos. Unknown es cuando googleTalkStatus no puede determinar mi estado. Stopped es el estado que existe despues de la llamada a googleTalkStatus.stop().

googleTalkStatus.delay: indica en milisegundos cada cuanto tiempo se debe consultar por mi estado a mis amigos.

googleTalkStatus.onReceiveTalkData: esta es importante, se debe usar en vez de googleTalk.onReceiveTalkData para que todo funcione bien. Será llamada incluso despues de haber detenido googleTalkStatus, así que no hay problema si se desactiva googleTalkStatus porque las comunicaciones propias del plugin continuarán a funcionar.
googleTalkStatus.onStatusChange: esta es un handler a la función que se debe llamar cada vez que googleTalkStatus.status cambia.

Metodos:
googleTalkStatus.start(): Inicializa googleTalkStatus, para que empieze a preguntar por mi estado. Esta función devuelve gddNoFriendsWithPlugin cuando no se han indicado los amigos a los cuales se les puede preguntar, es decir, options.GetValue('googleTalkStatus_friends') == "". Devuelve gddNoFriendsWithSideBar si ninguno de los amigos tiene Sidebar.
googleTalkStatus.stop(): Detiene googleTalkStatus, lo que no impide que mis amigos me pregunten por sus estados.

Ejemplo:

if (options.GetValue('check_my_status') == 'true') {
googleTalkStatus.onStatusChange = function(){utils.alert(googleTalkStatus.status)};
googleTalkStatus.onReceiveTalkData = function(friend, data){utils.alert(data)};
googleTalkStatus.start();
}


Para deterner googleTalkStatus se debe llamar googleTalkStatus.stop().

Y eso seria todo, lo demás depende de cada plugin, que cosa hará en googleTalkStatus.onStatusChange es especifico de cada plugin y no tiene ninguna relación con googleTalkStatus.

Para más detalle basta echar una mirada al codigo. Debo admitir que no está muy bien escrito pero lo llevo usando una semana y me ha funcionado bien.

Descargas:

Solo el js: googleTalkStatus.js
Un plugin de ejemplo que usa googleTalkStatus para decirte tu estado de GoogleTalk, obviamente para probarlo necesitas instalarlo en almenos dos PC con dos usuarios distintos de GoogleTalk.
GoogleTalkStatus.msi
GoogleTalkStatus_source.zip

0 Comments:

Publicar un comentario en la entrada

Links to this post:

Crear un vínculo

<< Home