• ¡Bienvenido a XenFácil!

    Estás viendo el sitio como Invitado. Para poder participar en este sitio

    y obtendrás privilegios adicionales, acceso a otras áreas y mucho mas.

    ¡Es gratis!


    ¿Ya eres miembro? Inicia sesión

Complemento XboxCard (generador de GamerCards de Xbox Live)

x7iBiT

Miembro
Mensajes
75
Puntuación de reacciones
42
Puntos
18
Sitio web
www.superligafifa.es
Bueno, este es mi primer (y único) complemente que hecho para XenForo. Se trata de un generador de GamerCard de un tamaño adecuado para el user_info de la izquierda de cada post. El resultado es una imagen PNG como esta:
x7ibit.png


Utiliza el "PHP Simple HTML DOM Parser" para sacar la información de cada perfil de la página oficial de Xbox:
http://gamercard.xbox.com/en-US/x7iBiT.card
Y luego con el nick/id (que se supone que ya lo tenemos), la imagen del avatar y los juegos, y la puntuación se compone la imagen usando las librerías GD de PHP.


Instalación:
  • Por FTP subir todo el contenido de la carpeta upload del zip al directorio donde está instalado XenForo
  • Crear un directorio en la raiz llamado cache, que a su vez tenga otro directorio llamado XboxCard, ya que precisamente en /cache/XboxCard/ es donde se irán guardando las imágenes (cada imagen pesa 10/11 kb, así que no hay que preocuparse mucho por el espacio). Importante que ambos directorios tengan permisos de escritura
  • Instalar el XML del complemento
  • Crear un campo personalizado simple con el el ID de Xbox Live, cosa que no tiene mucha complicación siguiendo el video puesto aquí. El fieldId del campo lo llamararemos por ejemplo XboxLive
  • Editar la plantilla message_user_info reemplazando:
    HTML:
                <xen:if is="@messageShowCustomFields AND {$user.customFields}">
                <xen:hook name="message_user_info_custom_fields" params="{xen:array 'user={$user}', 'isQuickReply={$isQuickReply}'}">
      
                    <xen:foreach loop="$userFieldsInfo" key="$fieldId" value="$fieldInfo">
                        <xen:if is="{$fieldInfo.viewable_message}">
                            <xen:if hascontent="true">
                                <dl class="pairsInline userField_{$fieldId}">
                                    <dt>{xen:helper userFieldTitle, $fieldId}:</dt>
                                    <dd><xen:contentcheck>{xen:helper userFieldValue, $fieldInfo, $user, {$user.customFields.{$fieldId}}}</xen:contentcheck></dd>
                                </dl>
                            </xen:if>
                        </xen:if>
                    </xen:foreach>
          
                </xen:hook>
                </xen:if>

    por:
    HTML:
                <xen:if is="@messageShowCustomFields AND {$user.customFields}">
                <xen:hook name="message_user_info_custom_fields" params="{xen:array 'user={$user}', 'isQuickReply={$isQuickReply}'}">
      
                    <xen:foreach loop="$userFieldsInfo" key="$fieldId" value="$fieldInfo">
                        <xen:if is="{$fieldInfo.viewable_message}">
                            <xen:if hascontent="true">
                                <xen:contentcheck>
                                <dl class="pairsInline userField_{$fieldId}">
                                    <dt>{xen:helper userFieldTitle, $fieldId}:</dt>
                                    <dd>
                                        <xen:if is="{$fieldId} == 'XboxLive'">
                                            <xen:hook name="message_user_info_extra_xbox" params="{xen:array 'xbox={xen:helper userFieldValue, $fieldInfo, $user, {$user.customFields.{$fieldId}}}'}"></xen:hook>
                                        <xen:else />
                                            {xen:helper userFieldValue, $fieldInfo, $user, {$user.customFields.{$fieldId}}}
                                        </xen:if>
                                    </dd>
                                </dl>
                                </xen:contentcheck>
                            </xen:if>
                        </xen:if>
                    </xen:foreach>
          
                </xen:hook>
                </xen:if>
El resultado final sería algo así:
user_info.png



PD: Todas las imágenes que usa este complemento, las cuales están en styles/XboxCard/, se pueden cambiar, aunque habría que respetar los tamaños y formatos de imagen para que no pasasen cosas raras. La lista de imágenes es la siguiente:
  • gamerCard_BG.png => el fondo del GamerCard.
  • gamerCard_A.png => avatar por defecto para cuando el usuario no tienen ninguno definido.
  • gamerCard_X.png => imagen del juego por defecto para cuando el usuario no tiene ningún juego jugado o tiene deshabilitado en privacidad que estos se muestren.
  • gamerCard_G.png => el símbolo G de la puntuación.
Por ejemplo el fondo es el que es más susceptible de cambiarlo. En el site que administro dada su temático el fondo es un campo de fúbol, pero evidentemente para otros foros quizás un fondo más genérico quedaría mejor. Eso si, para no tocar código sería mejor poner un fondo oscuro con el que contrasten las letras blancas.
 

Adjuntos

  • XboxCard_1.0.1.zip
    24 KB · Visitas: 56

x7iBiT

Miembro
Mensajes
75
Puntuación de reacciones
42
Puntos
18
Sitio web
www.superligafifa.es
El funcionamiento ya a nivel XenForo es simplemente un Listener del tipo Template Hook, el cual tiene un sólo parámetro y es el nick/id de Xbox Live. Su código es el siguiente:
PHP:
<?php
 
class XboxCard_Listener
{
    public static function templateHook($hookName, &$contents, array $hookParams, XenForo_Template_Abstract $template)
    {
        if ($hookName == 'message_user_info_extra_xbox')
        {
            $lowcaseID  = strtolower($hookParams[xbox]);
            $profileURL = 'http://live.xbox.com/es-ES/MyXbox/Profile?gamertag='.str_replace(' ', '%20', $lowcaseID);
            $cacheFile  = 'cache/XboxCard/'.str_replace(' ', '_', $lowcaseID).'.png';
            $cacheTime  = 172800; // 48 hours
 
            if ( !file_exists($cacheFile) || (time() - $cacheTime > filemtime($cacheFile)) )
            {
                include_once('simple_html_dom.php');
                $html = file_get_html('http://gamercard.xbox.com/en-US/'.str_replace(' ', '%20', $lowcaseID).'.card');
 
                $gamerTag  = $html->find('a[id=Gamertag]', 0)->plaintext;
                $gamerScore = $html->find('div[id=Gamerscore]', 0)->plaintext;
                $avatarImg  = $html->find('img', 0)->src;
                $gameImg1  = $html->find('img', 1)->src;
                $gameImg2  = $html->find('img', 2)->src;
                $gameImg3  = $html->find('img', 3)->src;
 
                $img = imagecreatetruecolor(110, 52);
                $tmp = imagecreatefrompng('styles/XboxCard/gamerCard_BG.png');
                imagecopy($img, $tmp, 0, 0, 0, 0, 110, 52);
                imagedestroy($tmp);
                $tmp = imagecreatefrompng('styles/XboxCard/gamerCard_G.png');
                imagecopy($img, $tmp, 52, 15, 0, 0, 10, 10);
                imagedestroy($tmp);
                $tmp = ( empty($avatarImg) ) ? imagecreatefrompng('styles/XboxCard/gamerCard_A.png') : imagecreatefrompng($avatarImg);
                imagecopyresampled($img, $tmp, 3, 17, 0, 0, 32, 32, 64, 64);
                imagedestroy($tmp);
                $tmp = ( empty($gameImg1) ) ? imagecreatefrompng('styles/XboxCard/gamerCard_X.png') : imagecreatefromjpeg($gameImg1);
                imagecopyresampled($img, $tmp, 38, 28, 0, 0, 21, 21, 32, 32);
                imagedestroy($tmp);
                $tmp = ( empty($gameImg2) ) ? imagecreatefrompng('styles/XboxCard/gamerCard_X.png') : imagecreatefromjpeg($gameImg2);
                imagecopyresampled($img, $tmp, 62, 28, 0, 0, 21, 21, 32, 32);
                imagedestroy($tmp);
                $tmp = ( empty($gameImg3) ) ? imagecreatefrompng('styles/XboxCard/gamerCard_X.png') : imagecreatefromjpeg($gameImg3);
                imagecopyresampled($img, $tmp, 86, 28, 0, 0, 21, 21, 32, 32);
                imagedestroy($tmp);
                $col = imagecolorresolve($img, 255, 255, 255);
                imagestring($img, 3, ((110 -  (strlen($gamerTag) * 7)) / 2) + 1, 1, $gamerTag, $col);
                imagestring($img, 2, 65, 13, $gamerScore, $col);
                imagepng($img, $cacheFile);
                imagedestroy($img);
            }
 
            $contents .= "<a href='$profileURL' title='$hookParams[xbox]' rel='nofollow' target='_blank' itemprop='url'>
                            <img src='$cacheFile' style='border-radius:3px;'>
                          </a>";
        }
    }
}

Lo primero que hace el código es un sistema sencillo de cacheo de los archivos PNG. Esto se hace para no sobrecargar el foro y que estas imágenes no se generen cada vez que se visita un hilo. El funcionamiento de este cacheo es bastante simple: si entre la fecha/hora actual del servidor, dada por la función PHP time(), y la fecha/hora del archivo PNG en cuestión, dada por la función PHP filemtime(), han pasado más de N milisegundos (esta N la definimos en la variable $cacheTime) entonces se genera la imagen, si no pasamos de largo y usamos la previamente creada.

En caso de generar la imagen usamos el "PHP Simple HTML DOM Parser" para sacar todos los datos de la página oficial: las URLs de la imagenes del avatar y los 3 últimos juegos jugados, el nick (ya viene dado), y la puntuación. Seguidamente armamos la imagen usando las funciones de la librería GD: imagecreate, imagedestroy, imagecopy, etc. Para más info sobre la librerís GD echar un ojo aquí:
http://php.net/manual/es/book.image.php

La salida del "Template Hook" es simplemente un link HTML con la página del perfil en Xbox.com con la imagen generada dentro:
PHP:
$contents .= "<a href='$profileURL' title='$hookParams[xbox]' rel='nofollow' target='_blank' itemprop='url'>
                            <img src='$cacheFile' style='border-radius:3px;'>
                          </a>";
 

lms

Administrador
Mensajes
7.741
Puntuación de reacciones
2.163
Puntos
2.613
Sitio web
xenfacil.com
País
España
Versión de XenForo
2.1.x
PayPal
Donar dinero a este usuario
Página web
Web
Lo que no entiendo es esta línea:
PHP:
if ($hookName == 'message_user_info_extra_xbox')

Es un hook que no conozco. ¿Funciona?

Salud2
 

x7iBiT

Miembro
Mensajes
75
Puntuación de reacciones
42
Puntos
18
Sitio web
www.superligafifa.es
Lo que no entiendo es esta línea:
PHP:
if ($hookName == 'message_user_info_extra_xbox')

Es un hook que no conozco. ¿Funciona?

Salud2

Es un hook nuevo creado para la ocasión. Esto está explicado en el vídeo que hay en el primer post de este hilo (ponerlo en HD a pantalla completa porque si no no se lee nada):
http://xenforo.com/community/threads/how-to-use-template-hooks.13167/

Es más, si no llega a ser por este vídeo este addon no lo hubiera hecho nunca.
 

lms

Administrador
Mensajes
7.741
Puntuación de reacciones
2.163
Puntos
2.613
Sitio web
xenfacil.com
País
España
Versión de XenForo
2.1.x
PayPal
Donar dinero a este usuario
Página web
Web
Ahora, con la explicación del segundo mensaje, está muy claro.

Salud2
 

x7iBiT

Miembro
Mensajes
75
Puntuación de reacciones
42
Puntos
18
Sitio web
www.superligafifa.es
Gracias. He editado un poco todo, dejando todos los pasos de la instalación en el primero, y luego ya la explicación del código en el segundo.

Por cierto, tengo una duda a ver si me podeis ayudar. En el fichero PHP (el Listener) tengo las rutas a las imágenes directas. Por ejemplo:
PHP:
imagecreatefrompng('styles/XboxCard/gamerCard_BG.png');
Sin embargo yo tengo XenForo instalado en la raíz y casi que pongo las manos en el fuego de que si estuviera instalado en un directorio no funcionaría.

¿Hay alguna forma de poder saber via PHP el directorio dentro del server en donde está instalado XenForo?
 

lms

Administrador
Mensajes
7.741
Puntuación de reacciones
2.163
Puntos
2.613
Sitio web
xenfacil.com
País
España
Versión de XenForo
2.1.x
PayPal
Donar dinero a este usuario
Página web
Web
Si creases un grupo de opciones, podrías crear una opción para la ruta de las imágenes llamada (por ejemplo) Xbox_image_path y cambiar
PHP:
imagecreatefrompng('styles/XboxCard/gamerCard_BG.png');
por
PHP:
imagecreatefrompng($xenOptions.Xbox_image_path . '/gamerCard_BG.png');
o crear antes una variable y referenciarla ahí.

En php se puede hacer de casi todo pero yo no soy programador.

Salud2
 

x7iBiT

Miembro
Mensajes
75
Puntuación de reacciones
42
Puntos
18
Sitio web
www.superligafifa.es
Si creases un grupo de opciones, podrías crear una opción para la ruta de las imágenes llamada (por ejemplo) Xbox_image_path y cambiar
PHP:
imagecreatefrompng('styles/XboxCard/gamerCard_BG.png');
por
PHP:
imagecreatefrompng($xenOptions.Xbox_image_path . '/gamerCard_BG.png');
o crear antes una variable y referenciarla ahí.

En php se puede hacer de casi todo pero yo no soy programador.

Salud2
Gracias por responder, yo buscaba alguna función de XenForo que te diera el directorio para no tener que hacerlo por opciones.

De todas maneras, lo de las opciones en los complementos es algo que no tengo dominado. ¿Alguna documentación o ayuda al respecto?
 

lms

Administrador
Mensajes
7.741
Puntuación de reacciones
2.163
Puntos
2.613
Sitio web
xenfacil.com
País
España
Versión de XenForo
2.1.x
PayPal
Donar dinero a este usuario
Página web
Web
Con xenforo en modo debug, crea un complemento y luego le creas las opciones. No es un proceso dificil.

Intento en estos días ponerte alguna imagen

Salud2 y Feliz Navidad
 

x7iBiT

Miembro
Mensajes
75
Puntuación de reacciones
42
Puntos
18
Sitio web
www.superligafifa.es
MultiGamers dijo:
hola , hay alguna manera d ver los logros por gamertag y ponerlos en la pagina?

El problema es que no hay espacio, porque el bloque del avatar de cada post tiene poco ancho y no da para más.

De todas formas si picas encima del gamercard te redirecciona a la página del perfil oficial en donde puedes ver los logros y demás.

Enviado desde mi Defy CM7 a través de Forum Runner
 

MultiGamers

Nuevo
Mensajes
12
Puntuación de reacciones
0
Puntos
1
El problema es que no hay espacio, porque el bloque del avatar de cada post tiene poco ancho y no da para más.

De todas formas si picas encima del gamercard te redirecciona a la página del perfil oficial en donde puedes ver los logros y demás.

Enviado desde mi Defy CM7 a través de Forum Runner

pero pide q me registre en xbox live . He probado lo que hacen en www.hdjuegos.net y sin registro ni nada te saca todos los trofeos de psn y xboxlive seguiditos.

eso no esta entonces para descarga no ?
 

x7iBiT

Miembro
Mensajes
75
Puntuación de reacciones
42
Puntos
18
Sitio web
www.superligafifa.es
pero pide q me registre en xbox live . He probado lo que hacen en www.hdjuegos.net y sin registro ni nada te saca todos los trofeos de psn y xboxlive seguiditos.

eso no esta entonces para descarga no ?


A ver el addon está terminado y es funcional, pero no es de trofeos específicamente. Este addon lo que hace es generar una imagen/gamercard de XboxLive tal que así:
x7ibit.png


Y la pone en el bloque de usuario de cada post de XenForo, quedando como resultado algo similar a esto:
user_info-png.1108


Luego si picas en la imagen te redirecciona (en mi caso) aquí:
http://live.xbox.com/es-ES/Profile?gamertag=x7iBiT
Y si tienes razón, acabo de ver que si no tienes cuenta de XboxLive (no es que haya que registrarse, es exactamente la misma cuenta que en la consola) no te muestra casi ningún dato.
 

MultiGamers

Nuevo
Mensajes
12
Puntuación de reacciones
0
Puntos
1
A ver el addon está terminado y es funcional, pero no es de trofeos específicamente. Este addon lo que hace es generar una imagen/gamercard de XboxLive tal que así:
x7ibit.png


Y la pone en el bloque de usuario de cada post de XenForo, quedando como resultado algo similar a esto:
user_info-png.1108


Luego si picas en la imagen te redirecciona (en mi caso) aquí:
http://live.xbox.com/es-ES/Profile?gamertag=x7iBiT
Y si tienes razón, acabo de ver que si no tienes cuenta de XboxLive (no es que haya que registrarse, es exactamente la misma cuenta que en la consola) no te muestra casi ningún dato.

muchas gracias !!! cogeremos con tu permiso este complemento
 

JoseLuis

Nuevo
Mensajes
10
Puntuación de reacciones
17
Puntos
3
Sitio web
www.hdjuegos.net
Modificando un poco el código del addon si se podrían sacar. El tema es que saber luego que hacer con la lista de de nombres...

Puedes guardarlo en una pequeña tabla como array , bien alterando la tabla de xf_user y añadiendo un campo más para evitar mas querys, o bien en una tabla vinculada de uno a muchos. Yo lo hago así en www.hdjuegos.net

De esta forma se pueden mostrar los ultimos juegos de Xbox Live del usuario y despues mostrar listas y demas.
 
Arriba