tag:blogger.com,1999:blog-6864629.post-1141535360308444502006-03-05T01:19:00.000-03:002006-07-06T23:13:39.486-04:00GoogleTalk Status<span style="font-family:georgia;"><span style="color: rgb(153, 51, 0);"><span style="font-weight: bold;">Actualización:</span> 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.</span><br /><br />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 </span><span style="font-family:georgia;">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:</span><br /><span style="font-family:georgia;"><br />La API de la Sidebar expone, entre otras, la variable global <span style="font-family:courier new;">googleTalk</span> la cual permite que el plugin se comunique con nuestros 'amigos' que también tengan instalada la Sidebar y el plugin en cuestion. <span style="font-family:courier new;">googleTalk</span> tiene la propiedad <span style="font-family:courier new;">friends</span> que es un arreglo de objectos <span style="font-family:courier new;">Friend</span>, con ella podemos saber el estado (online/idle/busy) de nuestros amigos.<br />Nota: <span style="font-family:courier new;">friends</span> solo expone nuestros amigos que están online, los que estan offline no aparecerán en el arreglo.<br /><br />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!<br /><br /><span style="font-weight: bold;font-size:130%;" >Como funciona</span><br /><br /><span style="font-weight: bold;">La idea es simple</span>, le pregunta periodicamente a mis amigos indicados en <span style="font-family:courier new;">options.GetValue('<span style="color: rgb(0, 153, 0);">googleTalkStatus_friends</span>')</span> siempre y cuando <span style="font-family:courier new;">options.GetValue('<span style="color: rgb(0, 153, 0);">check_my_status</span>') == 'true'</span>. Luego, cuando mi estado cambia llama <span style="font-family:courier new;">googleTalkStatus.<span style="color: rgb(153, 51, 153);">onChangeStatus</span></span>.<br /><br />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. </span><span style="font-family:georgia;"><span style="font-family:courier new;">googleTalkStatus_friends</span> debe ser la representación literal de un arreglo con los nombres de los amigos selecionados, ej: </span><span style="font-family:georgia;"><span style="font-family:courier new;">googleTalkStatus_friends = ['Juan Perez', 'Kaiser Soza']</span>.</span><br /><span style="font-family:georgia;"><br /></span><span style="font-family:georgia;"><span style="font-size:130%;"><span style="font-weight: bold;">Como se usa<br /><br /></span></span><span style="font-weight: bold;">googleTalkStatus</span> 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.<br /><br /><span style="font-weight: bold; font-style: italic;">Propiedades:</span><br /><span style="color: rgb(0, 0, 0); font-weight: bold;">googleTalkStatus</span>.<span style="font-style: italic; color: rgb(153, 51, 153);">status</span>: 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 <span style="font-family:courier new;">googleTalkStatus.<span style="color: rgb(153, 51, 153);">start()</span></span> 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 <span style="font-family:courier new;">googleTalkStatus.<span style="color: rgb(153, 51, 153);">stop()</span></span>.<br /><br /><span style="font-weight: bold;">googleTalkStatus</span>.<span style="font-style: italic; color: rgb(153, 51, 153);">delay</span>: indica en milisegundos cada cuanto tiempo se debe consultar por mi estado a mis amigos.<br /><br /><span style="font-weight: bold;">googleTalkStatus</span>.<span style="font-style: italic; color: rgb(153, 51, 153);">onReceiveTalkData</span>: esta es importante, se debe usar en vez de <span style="font-family:courier new;">googleTalk.onReceiveTalkData</span> 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.<br /><span style="font-weight: bold;">googleTalkStatus</span>.<span style="font-style: italic; color: rgb(153, 51, 153);">onStatusChange</span>: esta es un handler a la función que se debe llamar cada vez que <span style="font-family:courier new;">googleTalkStatus.<span style="color: rgb(153, 51, 153);">status</span></span> cambia.<br /><br /><span style="font-weight: bold; font-style: italic;">Metodos:</span><br /><span style="font-weight: bold;">googleTalkStatus</span>.<span style="font-style: italic; color: rgb(153, 51, 153);">start()</span>: Inicializa googleTalkStatus, para que empieze a preguntar por mi estado. Esta función devuelve <span style="font-family:courier new;">gddNoFriendsWithPlugin</span> cuando no se han indicado los amigos a los cuales se les puede preguntar, es decir, <span style="font-family:courier new;">options.GetValue('<span style="color: rgb(0, 153, 0);">googleTalkStatus_friends</span>') == ""</span>. Devuelve <span style="font-family:courier new;">gddNoFriendsWithSideBar</span> si ninguno de los amigos tiene Sidebar.<br /><span style="font-weight: bold;">googleTalkStatus</span>.<span style="color: rgb(153, 51, 153); font-style: italic;">stop()</span>: Detiene googleTalkStatus, lo que no impide que mis amigos me pregunten por sus estados.<br /><br /><span style="font-weight: bold; font-style: italic;">Ejemplo:</span><br /><br /><span style="font-size:85%;"><span style="font-family:courier new;">if (options.GetValue('check_my_status') == 'true') {</span><br /><span style="font-family:courier new;"> googleTalkStatus.onStatusChange = function(){utils.alert(googleTalkStatus.status)};</span><br /><span style="font-family:courier new;"> googleTalkStatus.onReceiveTalkData = function(friend, data){utils.alert(data)};</span><br /><span style="font-family:courier new;"> googleTalkStatus.start();</span><br /><span style="font-family:courier new;">}</span></span><br /><br /></span><span style="font-family:georgia;">Para deterner googleTalkStatus se debe llamar </span><span style="font-family:georgia;"><span style="font-family:courier new;">googleTalkStatus.stop()</span>.<br /><br /></span><span style="font-family:georgia;">Y eso seria todo, lo demás depende de cada plugin, que cosa hará en <span style="font-family:courier new;">googleTalkStatus.onStatusChange</span> es especifico de cada plugin y no tiene ninguna relación con googleTalkStatus.<br /></span><span style="font-family:georgia;"><br /></span><span style="font-family:georgia;">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.<br /><br /><span style="font-weight: bold; font-style: italic;">Descargas:<br /></span><br />Solo el js: <a href="http://www.filelodge.com/files/room15/383451/googleTalkStatus.js">googleTalkStatus.js</a><br />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.<br /><a href="http://www.filelodge.com/files/room15/383451/GoogleTalkStatus.msi">GoogleTalkStatus.msi</a><br /><a href="http://www.filelodge.com/files/room15/383451/googleTalkStatus_source.zip">GoogleTalkStatus_source.zip</a><br /></span>Francesco Barresihttp://www.blogger.com/profile/07396417056716676216noreply@blogger.com