[Plugin] Number of threads
Muchos conoceréis este plugin, lo que hace es mostrar el número de temas que tiene un usuario, pero a diferencia del de Santiago, el mío no es creand...

Muchos conoceréis este plugin, lo que hace es mostrar el número de temas que tiene un usuario, pero a diferencia del de Santiago, el mío no es creando una nueva tabla; El mío cuenta las columnas de los temas por el usuario, mucho más fácil y no hace falta una tabla de sobra, y lo mismo para el de MyBB Central; El de MyBB Central crea hasta un task, bueno con el mío que son 12 líneas espero que os guste.

PD: El nombre es una mierda jajaja

Descarga: [attachment=2045]
La demo está en mi web xD se me olvidó ponerlo jaja
Estaría bueno que separe la cantidad de temas y mensajes.
Esta bueno
Eso lo he hecho xD Es montón de fácil, de hecho lo he puesto en el theme de skm jaja

Tan sólo es restar $mybb->user['postnum'] - $Num xDD
vi tu code y es sencillo jeje es igual que el de dragon fever y noe me gusta mucho la idea de hacer consulta en cada post..
Como consejo mira yo en mi plugin PIP tambien cuenta los temas y lo hice de la siguiente manera y no realiza NINGUNA consulta en los post..

primero en el activate le puse a todos los usuarios sus numero de temas creados
Código PHP:
$query $db->simple_select("users""uid");
    while(
$user $db->fetch_array($query))
    {
        
$users[$user['uid']] = $user;
    }
    foreach(
$users as $user)
    {
        
$query $db->simple_select("threads""COUNT(tid) AS threads""uid = '".$user['uid']."'");
        
$threads_count intval($db->fetch_field($query"threads"));
        
$db->update_query("users", array("pip_threads" => $threads_count), "uid = '".$user['uid']."'");
    } 

y ya de ahi cuando alguien crea un tema se el agrega uno mas desde el siguente hook
Código PHP:
$plugins->add_hook("datahandler_post_insert_thread""pip_insert_thread_count_threads");
function 
pip_insert_thread_count_threads($thread)
{
    global 
$mybb$db;
    if(!
$thread->data['uid'])
    {
        return 
false;
    }
    if(
$thread->data['uid'] == $mybb->user['uid'])
    {
        
$uid $mybb->user['uid'];
        
$value $mybb->user['pip_threads'];
    }
    else
    {
        
$query $db->simple_select('users''pip_threads''uid = ' $thread['username'], array('limit' => 1));
        
$value $db->fetch_field('pip_threads'$query);
        
$uid $thread->data['uid'];
    }
    
$new_value = ++$value;
    
$db->update_query('users', array('pip_threads' => $new_value), 'uid = ' $uid);


y al eliminar un tema se loq uito asi
Código PHP:
$plugins->add_hook("class_moderation_delete_thread_start""pip_delete_thread_count");
function 
pip_delete_thread_count($tid)
{
    global 
$mybb$db$thread;

    
$query $db->query('SELECT t.uid, u.pip_threads FROM ' TABLE_PREFIX 'threads t JOIN ' TABLE_PREFIX 'users u ON t.uid = u.uid WHERE t.tid = ' $tid ' LIMIT 1');
    
$result $db->fetch_array($query);
    if(!
$result['uid'])
    {
        return 
false;
    }

    
$pip_threads $result['pip_threads'] - 1;
    
$uid $result['uid'];

    
$db->update_query('users', array('pip_threads' => $pip_threads), 'uid = ' $uid);


y en el postbit se puede poner {$post['pip_threads']} y los muestra y como veras no realiza NINGUNA consulta en el tema es por ello que es mucho mejor!!

Santiago creo uno que si no me equivo tampoco realiza NINGUNA consulta pero esta mejor el suyo xq pone en el perfil el numero de temas creador y el porcetahe de temas por dias
http://mods.mybb.com/view/thread-count-pro

espero no te enojes ya que es una critica constructiva pero en lo personnal esta mal tu plug por la cantidad de consultas que realizaria.....
Perdon no habia visto que ya habias puesto lo de santiago jaja pero bueno yo prefiero una tabla ya que eso no afecta nada ya que las consultas si cuentan mucho y se estaria realizando con el tuyo una por post imaginate un thread con 200 post???
una cosa mas ya encontre el plug de DragonFever miralo para que veas es igual solo que tu pones remplazar la plantilla y dragonfever no pone eso porq deja que los usuarios lo hagan manual xD

PD: Este es exesivamente viejo lo saco para 1.4x
Última modificación: 16 Jul, 2011, 12:31 pm por LeoNeL =D.
No iba a escribir este post, pero la frase "mucho más fácil y no hace falta una tabla de sobra" me hizo cambiar de opinión.

Mucho mas fácil? Si.
Mucho mejor? No.
Una tabla de sobra? No, no y no.

Tuve una razón (muy muy buena razón) para hacer el plugin de la manera en que lo hice: Optimización/rendimiento.

Funcionamiento de mi plugin:
  • Crea un nuevo campo en la base de datos. Ponele que agregue 2 o 3 MBs de espacio máximo en un foro con miles de usuarios.
  • Realiza 1 (una) consulta a la base de datos cuando el usuario crea o elimina un nuevo thread.
  • No realiza ninguna consulta cuando estás viendo un thread, ya que MyBB obtiene el valor de la base de datos automaticamente.

Funcionamiento de tu plugin:
  • No crea ningún campo en la base de datos. (Yeahhh!! Good for you!)
  • No realiza ninguna consulta a la base de datos cuando el usuario crea o elimina un nuevo thread. (Yeahh!! Query avoided!)
  • Cuando visitas un thread, realiza 1 (una) consulta a la base de datos por cada post que estés viendo. (Ouch! My bad...)

Pero eso no es todo, tu plugin no le ordena a la base de datos que cuente la cantidad de threads, si no que le ordena que extraiga todos y cada uno de los threads hechos por el usuario, y luego que los cuente.

Resultado:

En mi foro en localhost (donde el servidor tiene el 100% de los recursos disponibles), al ver un thread conteniendo 7 posts (todos hechos por el mismo usuario), los resultados son los siguientes:

Con tu plugin activado: 29
Con mi plugin activado: 22
Sin ningun plugin activado: 22

Screen de las consultas extra que hace tu plugin:
[Imagen: 2zsqgw8.jpg]

En un foro chico (MUY chico) y con un servidor decente (que no esté sobrevendido y bien configurado, con cache), no habría problemas.
Eso sí, en cuanto le agregas cientos/miles de visitas, el hosting te va a sacar a patadas :p



Las recomendaciones que te daría para el plugin:
  • Utiliza la funcion COUNT de mysql.
  • Crea un array global con la cantidad de threads hecho por el usuario X. Luego, antes de hacer la consulta a la base de datos, comprueba si ya la ha hecho anteriormente.

Aún así, con estas optimizaciones, el rendimiento en un foro mediano/grande no va a ser para nada bueno.



Ahora ya conoces las ventajas y desventajas que el método que estás utilizando tiene.
Suerte con el plugin Wink

PD: Estuve 30 minutos escribiendo esto y.... bueno, tenía que salir hace 25 minutos. Adios!

Edit: Ups, parece que Edson posteo antes algo parecido. Luego lo leere, que ahora me tengo que ir.
Edit 2: Ufa, no me resistí a leer. Lo único que me queda para decir: Edson, mi código es libre, pero está liberado bajo la GPL. Recuerdalo... Wink
Ahora si, chao!
Última modificación: 16 Jul, 2011, 12:46 pm por ExplosiveMan.
Por supuesto es casi justo lo que le indicaba q no realiza consultas de mas y por supuesto que mejor con el count y puede usarlo con el simple_select de MyBB como lo e hecho yo la verdad tampoco pensaba postear porque siempre que lo hago se enoja y me reclama pero tambien lo ise solo porque dice que una tabla de sobra lo cual veo mal de su parte y mucho menos que dice que es mas facil jeje!
(16 Jul, 2011, 12:23 pm)Edson Ordaz escribió: vi tu code y es sencillo jeje es igual que el de dragon fever y noe me gusta mucho la idea de hacer consulta en cada post..
Como consejo mira yo en mi plugin PIP tambien cuenta los temas y lo hice de la siguiente manera y no realiza NINGUNA consulta en los post..

primero en el activate le puse a todos los usuarios sus numero de temas creados
Código PHP:
$query $db->simple_select("users""uid");
    while(
$user $db->fetch_array($query))
    {
        
$users[$user['uid']] = $user;
    }
    foreach(
$users as $user)
    {
        
$query $db->simple_select("threads""COUNT(tid) AS threads""uid = '".$user['uid']."'");
        
$threads_count intval($db->fetch_field($query"threads"));
        
$db->update_query("users", array("pip_threads" => $threads_count), "uid = '".$user['uid']."'");
    } 

y ya de ahi cuando alguien crea un tema se el agrega uno mas desde el siguente hook
Código PHP:
$plugins->add_hook("datahandler_post_insert_thread""pip_insert_thread_count_threads");
function 
pip_insert_thread_count_threads($thread)
{
    global 
$mybb$db;
    if(!
$thread->data['uid'])
    {
        return 
false;
    }
    if(
$thread->data['uid'] == $mybb->user['uid'])
    {
        
$uid $mybb->user['uid'];
        
$value $mybb->user['pip_threads'];
    }
    else
    {
        
$query $db->simple_select('users''pip_threads''uid = ' $thread['username'], array('limit' => 1));
        
$value $db->fetch_field('pip_threads'$query);
        
$uid $thread->data['uid'];
    }
    
$new_value = ++$value;
    
$db->update_query('users', array('pip_threads' => $new_value), 'uid = ' $uid);


y al eliminar un tema se loq uito asi
Código PHP:
$plugins->add_hook("class_moderation_delete_thread_start""pip_delete_thread_count");
function 
pip_delete_thread_count($tid)
{
    global 
$mybb$db$thread;

    
$query $db->query('SELECT t.uid, u.pip_threads FROM ' TABLE_PREFIX 'threads t JOIN ' TABLE_PREFIX 'users u ON t.uid = u.uid WHERE t.tid = ' $tid ' LIMIT 1');
    
$result $db->fetch_array($query);
    if(!
$result['uid'])
    {
        return 
false;
    }

    
$pip_threads $result['pip_threads'] - 1;
    
$uid $result['uid'];

    
$db->update_query('users', array('pip_threads' => $pip_threads), 'uid = ' $uid);


y en el postbit se puede poner {$post['pip_threads']} y los muestra y como veras no realiza NINGUNA consulta en el tema es por ello que es mucho mejor!!

Santiago creo uno que si no me equivo tampoco realiza NINGUNA consulta pero esta mejor el suyo xq pone en el perfil el numero de temas creador y el porcetahe de temas por dias
http://mods.mybb.com/view/thread-count-pro

espero no te enojes ya que es una critica constructiva pero en lo personnal esta mal tu plug por la cantidad de consultas que realizaria.....
Perdon no habia visto que ya habias puesto lo de santiago jaja pero bueno yo prefiero una tabla ya que eso no afecta nada ya que las consultas si cuentan mucho y se estaria realizando con el tuyo una por post imaginate un thread con 200 post???
una cosa mas ya encontre el plug de DragonFever miralo para que veas es igual solo que tu pones remplazar la plantilla y dragonfever no pone eso porq deja que los usuarios lo hagan manual xD

PD: Este es exesivamente viejo lo saco para 1.4x

No tienes por que decirme como hacerlo xDD, y el de DragonFever? No lo conozco enserio.

(16 Jul, 2011, 12:38 pm)Santiago escribió: No iba a escribir este post, pero la frase "mucho más fácil y no hace falta una tabla de sobra" me hizo cambiar de opinión.

Mucho mas fácil? Si.
Mucho mejor? No.
Una tabla de sobra? No, no y no.

Tuve una razón (muy muy buena razón) para hacer el plugin de la manera en que lo hice: Optimización/rendimiento.

Funcionamiento de mi plugin:
  • Crea un nuevo campo en la base de datos. Ponele que agregue 2 o 3 MBs de espacio máximo en un foro con miles de usuarios.
  • Realiza 1 (una) consulta a la base de datos cuando el usuario crea o elimina un nuevo thread.
  • No realiza ninguna consulta cuando estás viendo un thread, ya que MyBB obtiene el valor de la base de datos automaticamente.

Funcionamiento de tu plugin:
  • No crea ningún campo en la base de datos. (Yeahhh!! Good for you!)
  • No realiza ninguna consulta a la base de datos cuando el usuario crea o elimina un nuevo thread. (Yeahh!! Query avoided!)
  • Cuando visitas un thread, realiza 1 (una) consulta a la base de datos por cada post que estés viendo. (Ouch! My bad...)

Pero eso no es todo, tu plugin no le ordena a la base de datos que cuente la cantidad de threads, si no que le ordena que extraiga todos y cada uno de los threads hechos por el usuario, y luego que los cuente.

Resultado:

En mi foro en localhost (donde el servidor tiene el 100% de los recursos disponibles), al ver un thread conteniendo 7 posts (todos hechos por el mismo usuario), los resultados son los siguientes:

Con tu plugin activado: 29
Con mi plugin activado: 22
Sin ningun plugin activado: 22

Screen de las consultas extra que hace tu plugin:
[Imagen: 2zsqgw8.jpg]

En un foro chico (MUY chico) y con un servidor decente (que no esté sobrevendido y bien configurado, con cache), no habría problemas.
Eso sí, en cuanto le agregas cientos/miles de visitas, el hosting te va a sacar a patadas :p



Las recomendaciones que te daría para el plugin:
  • Utiliza la funcion COUNT de mysql.
  • Crea un array global con la cantidad de threads hecho por el usuario X. Luego, antes de hacer la consulta a la base de datos, comprueba si ya la ha hecho anteriormente.

Aún así, con estas optimizaciones, el rendimiento en un foro mediano/grande no va a ser para nada bueno.



Ahora ya conoces las ventajas y desventajas que el método que estás utilizando tiene.
Suerte con el plugin Wink

PD: Estuve 30 minutos escribiendo esto y.... bueno, tenía que salir hace 25 minutos. Adios!

Edit: Ups, parece que Edson posteo antes algo parecido. Luego lo leere, que ahora me tengo que ir.
Edit 2: Ufa, no me resistí a leer. Lo único que me queda para decir: Edson, mi código es libre, pero está liberado bajo la GPL. Recuerdalo... Wink
Ahora si, chao!
¿Yeahhh!! Good for you!, Yeahh!! Query avoided!?
De qué vas diciéndome ese tipo de cosas?
(16 Jul, 2011, 12:47 pm)Edson Ordaz escribió: Por supuesto es casi justo lo que le indicaba q no realiza consultas de mas y por supuesto que mejor con el count y puede usarlo con el simple_select de MyBB como lo e hecho yo la verdad tampoco pensaba postear porque siempre que lo hago se enoja y me reclama pero tambien lo ise solo porque dice que una tabla de sobra lo cual veo mal de su parte y mucho menos que dice que es mas facil jeje!

Yo no me enojo por estas cosas, me enojo por la forma en la que dices las cosas, pero aquí me lo haz dicho bien y no sé que quieres pero siempre me terminas mostrando tus códigos aunque no te lo pida...

Y yo no he dicho que sobra la tabla, sólo que la veo inncesaria.
La tabla es necesaria para que el plugin carge el valor previamente ya contado de la tabla, tu plugin cuenta los temas cada que alguien ve un tema, por lo tanto hace mas llamados a la DB.

Así lo entiendo yo.
{SIGNATURE_IMAGE}