¡Bienvenido a PHPost!

Para participar en el foro, descargar complementos y acceder al chat, necesitas una cuenta activa.

Descarga Risus Nova 2.0 para comenzar tu comunidad.

Regístrate Descargar Risus Nova

¿Ya tienes cuenta? Inicia sesión aquí

Últimos temas

Estadísticas del foro
  • Mensajes del foro:1,957
  • Temas del foro:614
  • Miembros:1,036
  • Último miembro:carlos007r


Enviado por: Tronlar
05-30-2026, 06:13 PM
Foro: Terminados
- Sin respuestas

Sección Novatos v1.0
Para Risus Nova 2.0 — PHPost

Capturas
[img]Registrate o inicia tu sesión para ver este contenido[/img]
 
[img]Registrate o inicia tu sesión para ver este contenido[/img]
 


Sección dedicada a los usuarios novatos con sus posts y un TOP propio. Inspirado en la sección Novatos de Taringa. Reescrito desde cero para Risus Nova 2.0.


🌱 Características
 
  • Página propia en /novatos/
  • Posts de usuarios con rango Novato paginados
  • Posts fijados de novatos en la parte superior
  • TOP Posts y TOP Usuarios novatos con filtros: Hoy, Semana, Mes, Histórico
  • Enlace en el menú principal
  • Sin instalador ni base de datos nueva
 


🛠️ Instalación

Paso 1 — Subir los archivos
 
Código:
inc/class/c.novatos.php                               →  inc/class/
inc/php/novatos.php                                   →  inc/php/
t.novatos.tpl                                         →  themes/default/templates/
themes/default/templates/modules/m.novatos_tops.tpl  →  themes/default/templates/modules/


Paso 2 — En .htaccess arriba de # FOTOS agregar esto:
 
Código:
# NOVATOS
RewriteRule ^novatos/$ inc/php/novatos.php?action= [QSA,L]
RewriteRule ^novatos/tops/$ inc/php/novatos.php?action=tops [QSA,L]


Paso 3 — En head_submenu.tpl

Buscar:
 
Código:
<li{if $tsPage == 'buscador'} class="here"{/if}><a class=vctip title="Buscador" href="{$tsConfig.url}/buscador/">Buscador</a></li>


Agregar antes:
 
Código:
<li{if $tsPage == 'novatos'} class="here"{/if}><a class=vctip title="Sección Novatos" href="{$tsConfig.url}/novatos/"><i class="fa-solid fa-seedling"></i> Novatos</a></li>


Paso 4 — Borrar la caché

Borra el contenido de la carpeta /cache/ del sitio.



⚙️ Cambiar el rango novato

Si el rango novato en tu BD tiene un ID diferente al 3, abre c.novatos.php y cambia:
Código:
const RANGO_NOVATO = 3;
 


🗑️ Desinstalar

Elimina los archivos y quita los cambios en .htaccess y head_menu.tpl.

 
 
Descarga

Mediafire
http://Registrate o inicia tu sesión par... contenido


Google Drive
http://Registrate o inicia tu sesión par... contenido




¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.



Imprimir


Enviado por: Tronlar
05-30-2026, 02:15 PM
Foro: Terminados
- Sin respuestas

Shoutbox v2.0
Reescrito desde cero para Risus Nova 2.0 — PHPost


Captura
[img]Registrate o inicia tu sesión para ver este contenido[/img]
 


Shoutbox moderno reescrito completamente desde cero. Sin dependencias antiguas, con anti-flood, actualización automática cada 15 segundos y diseño limpio.



💬 Características
 
  • Actualización automática cada 15 segundos
  • Anti-flood — 10 segundos entre mensajes
  • Máximo 200 caracteres por mensaje
  • Solo usuarios registrados pueden escribir
  • Visitantes ven los mensajes pero no pueden escribir
  • Borrar mensaje propio con un clic
  • Admins pueden borrar cualquier mensaje
  • Sin dependencias antiguas (sin shadowbox, sin markItUp)
  • Compatible con PHP 8.3 y Risus Nova 2.0
 



🛠️ Instalación

Paso 1 — Ejecutar el instalador

Sube la carpeta install/ a la raíz y accede a:

 
Código:
Registrate o inicia tu sesión para ver este contenido


⚠️ Elimina la carpeta install/ cuando termine.


Paso 2 — Subir los archivos
 
Código:
inc/class/c.shoutbox.php                                →  inc/class/
inc/php/ajax/ajax.shoutbox.php                          →  inc/php/ajax/
themes/default/templates/modules/m.home_shoutbox.tpl   →  themes/default/templates/modules/
themes/default/templates/modules/m.shout_item.tpl      →  themes/default/templates/modules/


Paso 3 — En t.home.tpl

Agregar donde quieran colocarlo en la columna centro o derecha:
 
Código:
{include file='modules/m.home_shoutbox.tpl'}


Paso 4 — En posts.php

Buscar:
 
Código:
$smarty->assign("tsTopcat",$tsPosts->topcat());


Agregar debajo:
 
Código:
// ── Shoutbox ──
require_once TS_CLASS . 'c.shoutbox.php';
$tsSB = new tsShoutbox();
$smarty->assign('tsShouts', $tsSB->getShouts());
// ──────────────


Paso 5 — Borrar la caché

Borra el contenido de la carpeta /cache/ del sitio.




⚙️ Configurar

Abre inc/class/c.shoutbox.php y edita las constantes al principio:
  • MAX_LEN = 200 — máximo caracteres por mensaje
  • ANTIFLOOD = 10 — segundos entre mensajes
  • MAX_SHOUTS = 20 — número de mensajes visibles
 


🗑️ Desinstalar
 
Código:
DROP TABLE IF EXISTS w_shoutbox;

Elimina los archivos y quita los cambios en posts.php y t.home.tpl.

 
Descarga


Mediafire
http://Registrate o inicia tu sesión par... contenido


Google Drive
http://Registrate o inicia tu sesión par... contenido



¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.



Imprimir


Enviado por: Tronlar
05-30-2026, 01:11 PM
Foro: Terminados
- Sin respuestas

Tendencias y Destacados v1.0
Nuevo módulo para Risus Nova 2.0 — PHPost


Captura
[img]Registrate o inicia tu sesión para ver este contenido[/img]
 


Dos widgets para el sidebar de la portada: hashtags trending de las últimas 24h estilo Twitter y posts fijados por el admin.



🔥 Características

Tendencias (#hashtags)
  • Tags más usados en las últimas 24h
  • Tamaño proporcional al número de posts — más grande = más trending
  • Clic en el tag busca posts con ese tag
  • Sin instalador ni base de datos nueva — usa post_tags existente

Destacados (📌 PIN)
  • Posts marcados como sticky por el admin
  • Muestra título, comentarios, puntos y fecha
  • El admin fija posts desde Moderar Post → Sticky
 


🛠️ Instalación

Paso 1 — Subir los archivos
 
Código:
inc/class/c.trending.php                           →  inc/class/
themes/default/templates/modules/m.home_trending.tpl  →  themes/default/templates/modules/
themes/default/templates/modules/m.home_pins.tpl      →  themes/default/templates/modules/


Paso 2 — En posts.php buscar:
 
Código PHP:
$smarty->assign("tsTopcat",$tsPosts->topcat());
}




Reemplazar por:
 
Código:
$smarty->assign("tsTopcat",$tsPosts->topcat());
            // TRENDING Y PINS
            require_once TS_CLASS . 'c.trending.php';
            $tsTrend = new tsTrending();
            $smarty->assign('tsTrendingTags', $tsTrend->getTrendingTags(24, 15));
            $smarty->assign('tsPinnedPosts',  $tsTrend->getPinnedPosts(5));
        }
    }


Paso 3 — En t.home.tpl

Buscar:
 
Código:
{include file='modules/m.home_tags_relevantes.tpl'}


Arriba agregar:
 
Código:
{include file='modules/m.home_pins.tpl'}
{include file='modules/m.home_trending.tpl'}


Paso 4 — Borrar la caché

Borra el contenido de la carpeta /cache/ del sitio.



⚙️ Configurar
 
  • Fijar un post — abre cualquier post y usa Moderar Post → Sticky
  • Cambiar las horas del trending — cambia el 24 en getTrendingTags(24, 15)
  • Cambiar número de pins — cambia el 5 en getPinnedPosts(5)
 


🗑️ Desinstalar

Elimina los archivos y quita los cambios en el controlador y t.home.tpl.

 
Descarga


Mediafire
http://Registrate o inicia tu sesión par... contenido


Google Drive
http://Registrate o inicia tu sesión par... contenido




¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.




Imprimir


Enviado por: Tronlar
05-30-2026, 10:41 AM
Foro: Terminados
- Sin respuestas

Vídeos v1.0
Nuevo módulo para Risus Nova 2.0 — PHPost


Capturas
[img]Registrate o inicia tu sesión para ver este contenido[/img]
 
[img]Registrate o inicia tu sesión para ver este contenido[/img]
 
[img]Registrate o inicia tu sesión para ver este contenido[/img]
 
[img]Registrate o inicia tu sesión para ver este contenido[/img]
 
[img]Registrate o inicia tu sesión para ver este contenido[/img]
 
[img]Registrate o inicia tu sesión para ver este contenido[/img]
 
[img]Registrate o inicia tu sesión para ver este contenido[/img]
 
[img]Registrate o inicia tu sesión para ver este contenido[/img]
 


Sistema completo de vídeos hecho desde cero para Risus Nova 2.0. Soporta YouTube y Vimeo, con comentarios, reportes, panel admin y control de permisos por rango.


🎬 Características
 
  • Soporte para YouTube y Vimeo — pegar la URL y se genera el reproductor automáticamente
  • Grid de tarjetas con miniatura de YouTube sin bandas negras
  • Filtro por categoría y orden (nuevos / más vistos)
  • Comentarios en cada vídeo
  • Sistema de reportes — 3 reportes ocultan el vídeo automáticamente
  • Panel admin con gestión de vídeos y categorías
  • Control de permisos por rango desde Admin → Rangos
  • 7 categorías por defecto (configurables desde el admin)
  • Instalador automático — crea todas las tablas
  • Diseño responsive
 


🛠️ Instalación

Paso 1 — Ejecutar el instalador

Sube la carpeta install/ a la raíz y accede a:

 
Código:
Registrate o inicia tu sesión para ver este contenido


El instalador crea automáticamente:
  • Tabla v_videos
  • Tabla v_categorias con 7 categorías por defecto
  • Tabla v_comentarios
  • Tabla v_denuncias
  • Permiso govid añadido a todos los rangos


⚠️ Elimina la carpeta install/ cuando termine.



Paso 2 — Subir los archivos
 
Código:
inc/class/c.videos.php           →  inc/class/
inc/php/videos.php               →  inc/php/
inc/php/ajax/ajax.videos.php     →  inc/php/ajax/
t.videos.tpl                     →  themes/default/templates/
m.video_card.tpl                 →  themes/default/templates/modules/
m.video_ver.tpl                  →  themes/default/templates/modules/
m.video_nuevo.tpl                →  themes/default/templates/modules/
m.admin_videos.tpl               →  themes/default/templates/modules/
videos.css                       →  themes/default/css/


Paso 3 — En .htaccess

Arriba de # FOTOS agregar:
 
Código:
# VIDEOS
RewriteRule ^videos/$ inc/php/videos.php?action= [QSA,L]
RewriteRule ^videos/ver/([0-9]+)/$ inc/php/videos.php?action=ver&vid=$1 [QSA,L]
RewriteRule ^videos/nuevo/$ inc/php/videos.php?action=nuevo [QSA,L]
RewriteRule ^videos/usuario/([^/]+)/$ inc/php/videos.php?action=usuario&nick=$1 [QSA,L]
RewriteRule ^admin/videos$ inc/php/admin.php?action=videos [QSA,L]


Paso 4 — En admin.php

Buscar:
 
Código:
} elseif($action == 'feed'){


Agregar arriba:
 
Código:
} elseif($action == 'videos'){
    require_once TS_CLASS . 'c.videos.php';
    $tsV = new tsVideos();
    if (!empty($_GET['addcat']) && !empty($_POST['vcat_name'])) {
        $tsV->adminSaveCategoria();
        $tsCore->redirectTo($tsCore->settings['url'].'/admin/videos');
    }
    $filtro = (int)($_GET['status'] ?? -1);
    $smarty->assign('tsAdminVideos', $tsV->adminGetVideos());
    $smarty->assign('tsVCategorias', $tsV->getCategorias());
    $smarty->assign('tsVFiltro', $filtro);


Paso 5 — En t.admin.tpl

Antes del {/if} final añade:
 
Código:
{elseif $tsAction == 'videos'}
    {include file='modules/m.admin_videos.tpl'}


Paso 6 — En m.admin_rangos.tpl

Buscar:
 
Código:
<dl>
                                        <dt><label for="goaf">Anti-flood</label><br /><span>Tiempo que deben esperar entre acci&oacute;n.</span></dt>
                                        <dd><input type="text" id="goaf" name="global-antiflood" value="{$tsRango.permisos.goaf}" style="width:30%"/></dd>
                                    </dl>


Debajo agregar:
 
Código:
<dl>
<dt><label for="govid">Publicar Vídeos</label><br /><span>Podrán publicar vídeos en el sitio.</span></dt>
<dd><input type="checkbox" id="govid" name="global-publicarvideos" {if $tsRango.permisos.govid == 'on'}checked{/if} /></dd>
</dl>


Paso 7 — En c.admin.php

Buscar:

En saveRango() y newRango() busca la línea:
 
Código:
'gopfd' => $_POST['global-pointsforday']);


Reemplazar por:
 
Código:
'gopfd' => $_POST['global-pointsforday'],
            'govid' => $_POST['global-publicarvideos'],
        );


Paso 8 — En head_menu.tpl

Buscar:
 
Código:
{if $tsConfig.c_fotos_private == '1' && !$tsUser->is_member}{else}                                
                <li class="tabbed {if $tsPage == 'fotos'}here{/if}" id="tabbedfotos">
                    <a title="Ir a Fotos" onclick="menu('fotos', this.href); return false;" href="{$tsConfig.url}/fotos/">Fotos <i class="fa-solid fa-caret-down"></i></a>
                </li>                                
                {/if}


Debajo agregar:
 
Código:
<li class="tabbed {if $tsPage == 'videos'}here{/if}" id="tabbedvideos"><a title="Ir a Vídeos" href="{$tsConfig.url}/videos/">Vídeos <i class="fa-solid fa-film"></i></a></li>


Paso 9 — Activar el permiso en los rangos

En Admin → Rangos → Editar cada rango y activa Publicar Vídeos.




Paso 10 — Borrar la caché

Borra el contenido de la carpeta /cache/ del sitio.


📋 URLs del módulo
 
  • Portada de vídeos: /videos/
  • Ver vídeo: /videos/ver/ID/
  • Publicar vídeo: /videos/nuevo/
  • Vídeos de usuario: /videos/usuario/NICK/
  • Panel admin: /admin/videos
 


🗑️ Desinstalar
 
Código:
DROP TABLE IF EXISTS v_videos, v_categorias, v_comentarios, v_denuncias;

Elimina los archivos y quita los cambios realizados.

 
Descarga


Mediafire
http://Registrate o inicia tu sesión par...0.rar/file

Google Drive
http://Registrate o inicia tu sesión par... contenido




¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.



Imprimir


Enviado por: Tronlar
05-29-2026, 06:39 PM
Foro: Terminados
- Respuestas (1)

Newsletter v1.0
Nuevo módulo para Risus Nova 2.0 — PHPost

Captura
 
[img]Registrate o inicia tu sesión para ver este contenido[/img]
 
[img]Registrate o inicia tu sesión para ver este contenido[/img]


Sistema de newsletter con consentimiento explícito (RGPD). Los usuarios eligen si quieren recibir comunicaciones al registrarse. El admin puede enviar emails personalizados a todos los suscritos o por rangos específicos.


📧 Características
 
  • Casilla opcional en el registro — consentimiento explícito
  • Panel admin con estadísticas: suscritos / no suscritos / total
  • Enviar por rango o a todos los suscritos
  • Personalización con [usuario] para el nombre del destinatario
  • Botón desactivado si no hay suscritos
  • Email con enlace para cancelar la suscripción
  • Cumple con el RGPD
 


🛠️ Instalación

Paso 1 — Ejecutar el instalador

Sube la carpeta install/ a la raíz y accede a:

 
Código:
Registrate o inicia tu sesión para ver este contenido


⚠️ Elimina la carpeta install/ cuando termine.


Paso 2 — Subir los archivos
 
Código:
p.registro.form.tpl  →  themes/default/templates/php_files/
m.admin_newsletter.tpl  →  themes/default/templates/admin_mods/


Paso 3 — En c.registro.php

Buscar:
 
Código:
$tsData['user_id'] = db_exec('insert_id');


Debajo agregar:
 
Código:
// ── Newsletter: guardar consentimiento ──
$newsletter = !empty($_POST['newsletter']) ? 1 : 0;
db_exec([__FILE__, __LINE__], 'query',
    "UPDATE u_miembros SET user_newsletter = '$newsletter'
     WHERE user_id = '{$tsData['user_id']}'"
);
// ────────────────────────────────────────


Paso 4 — En admin.php

Buscar:

 
Código:
} elseif($action == 'feed'){


Arriba agregar:
 
Código:
} elseif($action == 'newsletter'){

    // Estadísticas
    $stats = [
        'suscritos'    => 0,
        'no_suscritos' => 0,
        'total'        => 0,
    ];
    $r = db_exec('fetch_row', db_exec([__FILE__, __LINE__], 'query',
        "SELECT
            SUM(user_newsletter = 1) AS s,
            SUM(user_newsletter = 0) AS n,
            COUNT(*) AS t
         FROM u_miembros WHERE user_activo = '1' AND user_baneado = '0'"
    ));
    if ($r) {
        $stats['suscritos']    = (int)$r[0];
        $stats['no_suscritos'] = (int)$r[1];
        $stats['total']        = (int)$r[2];
    }
    $smarty->assign('tsNewsletterStats', $stats);

    // Rangos con conteo de suscritos
    $rangos = result_array(db_exec([__FILE__, __LINE__], 'query',
        "SELECT r.rango_id, r.r_name, r.r_color,
                COUNT(u.user_id) AS suscritos
         FROM u_rangos AS r
         LEFT JOIN u_miembros AS u
            ON u.user_rango = r.rango_id
            AND u.user_newsletter = '1'
            AND u.user_activo = '1'
            AND u.user_baneado = '0'
         GROUP BY r.rango_id
         ORDER BY r.r_cant ASC"
    )) ?: [];
    $smarty->assign('tsNewsletterRangos', $rangos);

    // Enviar
    if (!empty($_GET['save']) && !empty($_POST['nl_subject']) && !empty($_POST['nl_body'])) {

        $asunto     = $tsCore->setSecure($_POST['nl_subject']);
        $cuerpo     = $_POST['nl_body'];
        $rangos_sel = $_POST['rangos'] ?? [];
        $todos      = empty($rangos_sel);

        if ($todos) {
            $where = "user_newsletter = '1' AND user_activo = '1' AND user_baneado = '0'";
        } else {
            $ids   = implode(',', array_map('intval', $rangos_sel));
            $where = "user_newsletter = '1' AND user_activo = '1' AND user_baneado = '0' AND user_rango IN ($ids)";
        }

        $usuarios = result_array(db_exec([__FILE__, __LINE__], 'query',
            "SELECT user_id, user_name, user_email FROM u_miembros WHERE $where"
        )) ?: [];

        if (empty($usuarios)) {
            $smarty->assign('tsNewsletterError', 'No hay usuarios suscritos en los rangos seleccionados.');
        } else {
            require_once TS_CLASS . 'c.emails.php';
            $total = 0;
            foreach ($usuarios as $u) {
                $msg  = str_replace('[usuario]', $u['user_name'], $cuerpo);
                $html = '<div style="font-family:Arial,sans-serif;max-width:600px;margin:0 auto;">';
                $html .= '<div style="background:#3498db;padding:16px 24px;">';
                $html .= '<h1 style="color:#fff;margin:0;font-size:22px;">' . $tsCore->settings['titulo'] . '</h1>';
                $html .= '</div>';
                $html .= '<div style="padding:24px;background:#fff;border:1px solid #eee;">';
                $html .= '<p style="font-size:15px;color:#333;line-height:1.7;">' . nl2br(htmlspecialchars($msg)) . '</p>';
                $html .= '</div>';
                $html .= '<div style="padding:12px 24px;background:#f8f9fa;font-size:11px;color:#999;text-align:center;">';
                $html .= 'Para cancelar la suscripción accede a tu <a href="' . $tsCore->settings['url'] . '/cuenta/">cuenta</a>.';
                $html .= '</div></div>';

                $tsEmail = new tsEmail('newsletter', 'newsletter');
                $tsEmail->emailTo      = $u['user_email'];
                $tsEmail->emailSubject = $asunto;
                $tsEmail->emailBody    = $html;
                $tsEmail->emailHeaders = $tsEmail->setEmailHeaders();
                $tsEmail->sendEmail($tsCore->settings['email'], $u['user_email'], $asunto, $html);
                $total++;
            }
            $smarty->assign('tsNewsletterEnviado', $total);
        }
    }


Paso 5 — Añadir en t.admin.tpl

Antes del {/if} final añade:
 
Código:
{elseif $tsAction == 'newsletter'}
    {include file='admin_mods/m.admin_newsletter.tpl'}


Paso 6 — En m.admin_sidemenu.tpl agregan esto donde quieran:

Código:
<li><a href="{$tsConfig.url}/admin/newsletter"><i class="fa-solid fa-envelope-open-text"></i> Newsletter</a></li>


Paso 7 — Borrar la caché

Borra el contenido de la carpeta [b]/cache/ del sitio.
[/b]
 


🔒 RGPD
 
  • El usuario da consentimiento explícito al registrarse
  • Puede cancelar la suscripción desde su cuenta
  • Solo se envía a usuarios que aceptaron recibirlo
  • Las contraseñas nunca se incluyen en ningún email


🗑️ Desinstalar

Código:
ALTER TABLE u_miembros DROP COLUMN user_newsletter;

Elimina los archivos y quita los hooks.
 

 
Descarga


Mediafire
http://Registrate o inicia tu sesión par... contenido


Google Drive
http://Registrate o inicia tu sesión par... contenido




¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.[/b]

Imprimir


Enviado por: Tronlar
05-29-2026, 05:46 PM
Foro: Terminados
- Sin respuestas

Avisos Masivos v1.0
Nuevo módulo para Risus Nova 2.0 — PHPost


Captura
[img]Registrate o inicia tu sesión para ver este contenido[/img]


Permite al admin enviar un aviso a todos los usuarios o a rangos específicos desde el panel. El aviso aparece en las notificaciones de cada usuario.


📢 Características
 
  • Enviar a todos los usuarios o a rangos específicos
  • Selección múltiple de rangos
  • Asunto y mensaje personalizables (máx 500 caracteres)
  • Los admins y moderadores no reciben el aviso
  • Confirmación antes de enviar
  • Muestra cuántos usuarios recibieron el aviso
  • Sin instalador ni base de datos nueva
 


🛠️ Instalación

Paso 1 — Subir el archivo
 
Código:
themes/default/templates/admin_mods/m.admin_avisos_masivos.tpl
  →  themes/default/templates/admin_mods/


Paso 2 — En admin.php

Buscar:
Código:
} elseif($action == 'feed'){


Agregar arriba:
Código:
} elseif($action == 'avisosmasivos'){

    $rangos = result_array(db_exec([__FILE__, __LINE__], 'query',
        "SELECT rango_id, r_name, r_color FROM u_rangos
         WHERE r_type = '1' ORDER BY r_cant ASC"
    )) ?: [];
    $smarty->assign('tsRangosDisponibles', $rangos);

    if (!empty($_GET['save']) && !empty($_POST['av_subject']) && !empty($_POST['av_body'])) {
        $asunto     = $tsCore->setSecure($_POST['av_subject']);
        $cuerpo     = $tsCore->setSecure($_POST['av_body']);
        $rangos_sel = $_POST['rangos'] ?? [];
        $todos      = empty($rangos_sel);

        if ($todos) {
            $where = "user_activo = '1' AND user_baneado = '0'";
        } else {
            $ids   = implode(',', array_map('intval', $rangos_sel));
            $where = "user_activo = '1' AND user_baneado = '0' AND user_rango IN ($ids)";
        }

        $usuarios = result_array(db_exec([__FILE__, __LINE__], 'query',
            "SELECT user_id FROM u_miembros WHERE $where"
        )) ?: [];

        $total = 0;
        $fecha = time();
        foreach ($usuarios as $u) {
            db_exec([__FILE__, __LINE__], 'query',
                "INSERT INTO u_avisos (user_id, av_subject, av_body, av_date, av_type)
                 VALUES ('{$u['user_id']}', '$asunto', '$cuerpo', '$fecha', '4')"
            );
            $total++;
        }
        $smarty->assign('tsAvisoEnviado', $total);
    }


Paso 3 — Añadir en t.admin.tpl

Antes del {/if} final agregar:
 
Código:
{elseif $tsAction == 'avisosmasivos'}
    {include file='admin_mods/m.admin_avisos_masivos.tpl'}


Paso 4 — En m.admin_sidemenu.tpl ponen esto donde quieran:
Código:
<i class="fa-solid fa-bullhorn"></i> Avisos Masivos</a></li><li><a href="{$tsConfig.url}/admin/mensajesadmin"><i class="fa-solid fa-envelope"></i> Mensajes Privados</a></li>


Paso 5 — Borrar la caché

Borra el contenido de la carpeta /cache/ del sitio.


🗑️ Desinstalar

Elimina la plantilla y quita los cambios en admin.php y t.admin.tpl.

 
Descarga


Mediafire
http://Registrate o inicia tu sesión par... contenido


Google Drive
http://Registrate o inicia tu sesión par... contenido



¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.




Imprimir


Enviado por: Tronlar
05-29-2026, 05:21 PM
Foro: Terminados
- Sin respuestas

Panel de Mensajes Privados v1.0
Nuevo módulo para Risus Nova 2.0 — PHPost


Capturas
[img]Registrate o inicia tu sesión para ver este contenido[/img]
 
[img]Registrate o inicia tu sesión para ver este contenido[/img]
 
[img]Registrate o inicia tu sesión para ver este contenido[/img]


Panel para gestionar los mensajes privados entre usuarios desde el admin. Ver conversaciones completas, eliminar mensajes individuales o respuestas, y enviar alertas a usuarios.


✉️ Características
 
  • Lista paginada de todos los mensajes privados
  • Ver remitente, destinatario, asunto y fecha
  • Leer conversación completa con avatares
  • Eliminar mensajes completos o respuestas individuales
  • Enviar alerta al usuario directamente
  • Muestra IP de cada respuesta
  • Sin instalador ni base de datos nueva
 


🛠️ Instalación

Paso 1 — Subir los archivos
 
Código:
inc/class/c.mensajes_admin.php                           →  inc/class/
inc/ajax.mensajes_admin.php                              →  inc/php/ajax/
themes/default/templates/admin_mods/m.admin_mensajes.tpl →  themes/default/templates/admin_mods/


Paso 2 — En .htaccess

Buscar:

Código:
RewriteRule ^admin/news/nueva inc/php/admin.php?action=news&act=nuevo [QSA,L]


Debajo agregar:
Código:
RewriteRule ^admin/mensajesadmin/leer/([0-9]+)$ inc/php/admin.php?action=mensajesadmin&act=leer&mpid=$1 [QSA,L]


En admin.php

Buscar:
 
Código:
} elseif($action == 'temas'){


Agregar arriba:
Código:
} elseif($action == 'mensajesadmin'){
    require_once TS_CLASS . 'c.mensajes_admin.php';
    $tsMAdmin = new tsMensajesAdmin();
    if (empty($act)) {
        $smarty->assign('tsMensajesLista', $tsMAdmin->getLista());
    } elseif ($act == 'leer') {
        $smarty->assign('tsMensajesCabecera', $tsMAdmin->getCabecera());
        $smarty->assign('tsMensajesRespuestas', $tsMAdmin->getRespuestas());
    }


Paso 4 — En ajax.admin.php

Buscar:
Código:
'admin-badwords-delete' => array('n' => 4, 'p' => ''),


Debajo agregar:
Código:
'mp-admin-borrar' => array('n' => 4, 'p' => ''),
        'mp-admin-borrar-respuesta' => array('n' => 4, 'p' => ''),


Buscar al final:
Código:
default:
    die('0: Este archivo no existe.');
break;


Agregar arriba:
Código:
case 'mp-admin-borrar':
case 'mp-admin-borrar-respuesta':
    require_once TS_CLASS . 'c.mensajes_admin.php';
    $tsMAdmin = new tsMensajesAdmin();
    if ($action === 'mp-admin-borrar') echo $tsMAdmin->eliminarMensaje();
    else echo $tsMAdmin->eliminarRespuesta();
break;


Paso 5 — En t.admin.tpl

Antes del {/if} final agregar:
Código:
{elseif $tsAction == 'mensajesadmin'}
    {include file='admin_mods/m.admin_mensajes.tpl'}


Paso 6 — En m.admin_sidemenu.tpl agregar esto donde quieran:
Código:
<li><a href="{$tsConfig.url}/admin/mensajesadmin"><i class="fa-solid fa-envelope"></i> Mensajes Privados</a></li>


Paso 7 — Borrar la caché

Borra el contenido de la carpeta /cache/ del sitio.


🗑️ Desinstalar

Elimina los archivos y quita los cambios en admin.php, ajax.admin.php y t.admin.tpl.

 
 
Descarga

Mediafire
http://Registrate o inicia tu sesión par... contenido

Google Drive
http://Registrate o inicia tu sesión par... contenido




¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.




Imprimir


Enviado por: Tronlar
05-29-2026, 02:09 PM
Foro: Terminados
- Sin respuestas

Destacados en Tiempo Real v1.0
Nuevo módulo para Risus Nova 2.0 — PHPost


Captura
[img]Registrate o inicia tu sesión para ver este contenido[/img]


Widget para la portada con los posts más votados en las últimas horas. Filtros de 15 min, 1h, 3h y 6h. El mismo estilo que el TOP Posts existente. Inspirado en el sistema de "Destacados" de Taringa.


🔥 Características
 
  • 4 filtros de tiempo: 15 min, 1h, 3h y 6h
  • Carga con AJAX — sin recargar la página
  • Mismo estilo que el TOP Posts existente
  • Sin instalador ni base de datos
  • Solo 2 archivos a subir
 


🛠️ Instalación

Paso 1 — Subir los archivos
 
Código:
inc/php/ajax/ajax.destacados.php               →  inc/php/ajax/
themes/default/templates/modules/m.destacados.tpl  →  themes/default/templates/modules/

Paso 2 — Añadir el widget en la portada

En t.home.tpl pones esto donde quieras:

 
Código:
{include file='modules/m.destacados.tpl'}


Paso 3 — Borrar la caché

Borra el contenido de la carpeta /cache/ del sitio.



🗑️ Desinstalar

Elimina los 2 archivos y quita el include de la plantilla.

 
Descarga


Mediafire
http://Registrate o inicia tu sesión par... contenido


Google Drive
http://Registrate o inicia tu sesión par... contenido





¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.






Imprimir


Enviado por: Tronlar
05-29-2026, 12:03 PM
Foro: Terminados
- Sin respuestas

Niveles de Actividad v1.0
Nuevo módulo para Risus Nova 2.0 — PHPost


Captura
[img]Registrate o inicia tu sesión para ver este contenido[/img]


Muestra en el perfil del usuario su nivel de actividad con una barra de progreso hacia el siguiente rango. Usa los rangos ya configurados en el script — no crea nuevos.


📊 Características
 
  • Barra de progreso hacia el siguiente rango
  • Muestra puntos actuales y cuántos faltan
  • Rangos especiales (Admin, Mod) — barra dorada sin progreso
  • Usa los rangos existentes del script
  • Sin instalador ni base de datos
 


🛠️ Instalación

Paso 1 — Subir los archivos
 
Código:
inc/nivel_helper.php                               →  inc/class/
m.perfil_nivel.tpl                                 →  themes/default/templates/modules/


Paso 2 — En perfil.php

Busca en inc/php/perfil.php:

 
Código:
$smarty->assign("tsGeneral",$tsGeneral);


Debajo agregar:
 
Código:
// ── Niveles de actividad ──
require_once TS_CLASS . 'nivel_helper.php';
$smarty->assign('tsNivel', tsGetNivel($tsInfo['stats']['user_puntos'], $tsInfo['stats']['user_rango']));
// ─────────────────────────


Paso 3 — En m.perfil_sidebar.tpl

Añade antes del widget de medallas:

 
Código:
{include file='modules/m.perfil_nivel.tpl'}


Paso 4 — Borrar la caché

Borra el contenido de la carpeta /cache/ del sitio.


🗑️ Desinstalar

Elimina los archivos y quita los hooks. No hay tablas que borrar.

 
Descarga


Mediafire
http://Registrate o inicia tu sesión par... contenido


Google Drive
http://Registrate o inicia tu sesión par... contenido



¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.



Imprimir


Enviado por: Tronlar
05-29-2026, 11:35 AM
Foro: Terminados
- Sin respuestas

Robots.txt Dinámico v1.0
Nuevo módulo para Risus Nova 2.0 — PHPost


Capturas
[img]Registrate o inicia tu sesión para ver este contenido[/img]
[img]Registrate o inicia tu sesión para ver este contenido[/img]


Añade un editor de robots.txt en el panel de admin. Edita el contenido desde el navegador sin necesidad de FTP. Incluye un robots.txt por defecto optimizado para el script.


🤖 Características
 
  • Editor de robots.txt en el panel admin
  • Robots.txt por defecto optimizado para Risus Nova
  • Botón para restaurar el contenido por defecto
  • La URL del sitemap se añade automáticamente con tu dominio
  • Ver el robots.txt actual con un clic
 


🛠️ Instalación

Paso 1 — Subir los archivos
 
Código:
robots.txt                                          →  raíz del sitio
robots_default.txt                                  →  raíz del sitio
inc/php/robots.php                                  →  inc/php/
themes/default/templates/admin_mods/m.admin_robotstxt.tpl  →  themes/default/templates/admin_mods/

Paso 2 — En admin.php

Busca:

 
Código:
} elseif($action == 'feed'){

Añade justo antes:
 
Código:
} elseif($action == 'robotstxt'){

    $robots_file   = TS_ROOT . '/robots.txt';
    $default_file  = TS_ROOT . '/robots_default.txt';

    if (!empty($_GET['reset']) && file_exists($default_file)) {
        copy($default_file, $robots_file);
        $tsCore->redirectTo($tsCore->settings['url'] . '/admin/robotstxt?saved=1');
    }

    if (!empty($_GET['save']) && isset($_POST['contenido'])) {
        $contenido = strip_tags($_POST['contenido']);
        if (file_put_contents($robots_file, $contenido) !== false) {
            $smarty->assign('tsRobotsSaved', true);
        } else {
            $smarty->assign('tsRobotsError', 'No se pudo guardar. Verifica los permisos de escritura.');
        }
    }

    if (!empty($_GET['saved'])) $smarty->assign('tsRobotsSaved', true);

    $contenido_actual = file_exists($robots_file)
        ? htmlspecialchars(file_get_contents($robots_file))
        : htmlspecialchars(file_get_contents($default_file));

    $smarty->assign('tsRobotsContenido', $contenido_actual);

Paso 3 — Añadir en t.admin.tpl

Añade antes del {/if} final:

 
Código:
{elseif $tsAction == 'robotstxt'}
    {include file='admin_mods/m.admin_robotstxt.tpl'}


Paso 4 — En m.admin_sidemenu.tpl poner esto donde quieran
 
Código:
<li><a href="{$tsConfig.url}/admin/robotstxt"><i class="fa-solid fa-robot"></i> Robots.txt</a></li>


Paso 5 — Borrar la caché

Borra el contenido de la carpeta /cache/ del sitio.


⚠️ Permisos

El archivo robots.txt en la raíz debe tener permisos de escritura (644 o 666). Si no se puede guardar verifica los permisos desde el cPanel o FTP.


🗑️ Desinstalar

Elimina los archivos y quita los cambios en admin.php y t.admin.tpl.

 
Descarga

Mediafire
http://Registrate o inicia tu sesión par... contenido

Google Drive
http://Registrate o inicia tu sesión par... contenido


¿Tienes dudas o encuentras algún problema? Déjalo en los comentarios.




Imprimir