Bueno phpbb utiliza una tabla de la base de datos llamada phpbb_sessions:
Código:
CREATE TABLE phpbb_sessions(
session_id varchar(32) NOT NULL,
session_user_id mediumint(8) NOT NULL,
session_start int(11) NOT NULL,
session_time int(11) NOT NULL,
session_ip varchar(8) NOT NULL,
session_page int(11) NOT NULL,
session_logged_in tinyint(1) NOT NULL,
session_robot varchar(32),
PRIMARY KEY (session_id),
KEY session_user_id (session_user_id),
KEY session_id_ip_user_id (session_id, session_ip, session_user_id)
);
para gestionar las sesiones, y otra llamada phpbb_users que contiene algunos datos que te pueden servir:
Código:
CREATE TABLE phpbb_users(
user_id mediumint(8) NOT NULL,
user_active tinyint(1) DEFAULT '1',
username varchar(25) NOT NULL,
user_password varchar(32) NOT NULL,
user_session_time int(11) NOT NULL,
user_session_page smallint(5) NOT NULL,
user_lastvisit int(11) NOT NULL,
user_regdate int(11) NOT NULL,
user_level tinyint(4),
user_posts mediumint(8) unsigned NOT NULL,
user_timezone decimal(5,2) DEFAULT '0.00' NOT NULL,
user_style tinyint(4),
user_lang varchar(255),
user_dateformat varchar(14) DEFAULT 'd M Y H:i' NOT NULL,
user_new_privmsg smallint(5) unsigned NOT NULL,
user_unread_privmsg smallint(5) unsigned NOT NULL,
user_last_privmsg int(11) NOT NULL,
user_emailtime int(11),
user_viewemail tinyint(1),
user_attachsig tinyint(1),
user_allowhtml tinyint(1) DEFAULT '1',
user_allowbbcode tinyint(1) DEFAULT '1',
user_allowsmile tinyint(1) DEFAULT '1',
user_allowavatar tinyint(1) DEFAULT '1' NOT NULL,
user_allow_pm tinyint(1) DEFAULT '1' NOT NULL,
user_allow_viewonline tinyint(1) DEFAULT '1' NOT NULL,
user_notify tinyint(1) DEFAULT '1' NOT NULL,
user_notify_pm tinyint(1) NOT NULL,
user_popup_pm tinyint(1) NOT NULL,
user_rank int(11),
user_avatar varchar(100),
user_avatar_type tinyint(4) NOT NULL,
user_email varchar(255),
user_icq varchar(15),
user_website varchar(100),
user_from varchar(100),
user_sig text,
user_sig_bbcode_uid varchar(10),
user_aim varchar(255),
user_yim varchar(255),
user_msnm varchar(255),
user_occ varchar(100),
user_interests varchar(255),
user_actkey varchar(32),
user_newpasswd varchar(32),
user_pro smallint(1),
user_privmsgs_per_page smallint(3) DEFAULT '5',
user_punto decimal(11,0) NOT NULL,
PRIMARY KEY (user_id),
KEY user_session_time (user_session_time)
);
Se supone que con esa tabla, ya podrías crear una funcioncilla que determine si el usuario actual (parto del supuesto de que desde ASP, hay formas de averiguar la ip del cliente, pero luego seguiré con eso, es que no he programado nunca con ASP) está o no conectado.
Bien para determinar si el usuario está conectado o no, lo primero que debemos de hacer, es establecer un tiempo de expiración para la sesión, sin eso, no podremos determinar si el usuario está conectado o no. Y luego simplemente(digo simplemente pero tiene su miga) se trataría de buscar en la tabla phpbb_sessions, si existe una coincidencia de la i.p del cliente en el campo session_ip, y si la hay, coger el campo session_time que contiene la fecha en formato timestamp de la última vez que phpBB tubo noticias de esa IP. Entonces consultariamos el valor de la resta del tiempo actual (función time () ) con ése valor que acabamos de extraer, y si el resultado es mayor al tiempo que nosotros consideramos que ha de pasar para que la sesión no siga pués se acabó, el usuario ya no se supondrá conectado, y si no, pués recogemos el session_user_id, y consultamos en la tabla phpbb_users los datos que requiramos del usuario. Yo diría que para que todo tuviese sentido la duración de la sesión debería de ser la misma que en phpbb, está duración cómo sabes se puede configurar en el ACP, pero además es accesible supongo desde ASP(por si quieres hacer las cosas bien), en la tabla phpbb_config, te pongo un backup de mi fila para ese dato:
Código:
INSERT INTO phpbb_config (config_name, config_value) VALUES('session_length', '3600');
Bueno sigamos, hemos hablado de utilizar la I.P del cliente para consultar a nuestra DB(tabla phpbb_sessions) sí existe una coincidencia y en este caso actuar, sí el tiempo de último acceso(phpbb_ssesions.session_time) es anterior al actual menos el tiempo de sesión no se activará una contiguidad en la sesión, pero resulta que phpbb, a la hora de introducir la I.P en esa tabla que nosotros necesitamos para nuestra funcioncilla, la codifica.
Te pongo una especie de resumen de lo que hace para sacar esa codificación:
Código PHP:
<?
function encode_ip($dotquad_ip)
{
$ip_sep = explode('.', $dotquad_ip);
return sprintf('%02x%02x%02x%02x', $ip_sep[0], $ip_sep[1], $ip_sep[2], $ip_sep[3]);
}
$client_ip = ( !empty($HTTP_SERVER_VARS['REMOTE_ADDR']) ) ? $HTTP_SERVER_VARS['REMOTE_ADDR'] : ( ( !empty($HTTP_ENV_VARS['REMOTE_ADDR']) ) ? $HTTP_ENV_VARS['REMOTE_ADDR'] : $REMOTE_ADDR );
print $client_ip."<br>";
$user_ip = encode_ip($client_ip);
print $user_ip;
?>
Para averiguar la I.P utiliza una condición anidada, pero es muy importante, que cuando hagas tus pruebas en ASP, la I.P que te devuelve tu script coincida con la que tevuelve este script, sino todo esto que estamos haciendo no sirve, lo digo porque hay varias formas de obtener la I.P cómo por ejemplo HTTP_X_FORWARDED_FOR, que en las últimas versiones de phpbb ha sido suprimido(consulta el archivo common.php lin.186 para ver si tienes éste comentario):
Cita: //
// Obtain and encode users IP
//
// I'm removing HTTP_X_FORWARDED_FOR ... this may well cause other problems such as
// private range IP's appearing instead of the guilty routable IP, tough, don't
// even bother complaining ... go scream and shout at the idiots out there who feel
// "clever" is doing harm rather than good ... karma is a great thing ... :)
Y luego la codificación de la I.P consiste simplemente en pasar a hexadecimal (con las letras minúsculas) cada una de las cuatro números de la I.P, y quitar los puntos. Mira
http://elotrositio.tuarrobanet.com/cod_ip.php aquí te sale cómo recoge phpBB tu i.p y cómo la codificaría. Por eso necesitas crearte una funcioncilla que 'codifique' la I.P de esta forma, sino preguntarás algo a la DB que nunca obtendrá resultados.
Creo que respecto de cómo consultar las sesiones phpBB es todo, ahora bien, si desde tu página quieres además continuar (estamos hablando de trabajar con ASP) con esa sesión, lo que deberiamos hacer a cada recarga es basarte en ese mismo proceso, es decir, necesitarías al menos actualizar :
phpbb_users.user_session_time _>tiempo de la sesión actual(de no ser que sea invi en cuyo caso nada)
phpbb_users.user_lastvisit ->tiempo de último acceso de usuario(de no ser que bla bla bla)
phpbb_sessions.session_time -> tiempo de sesión (para invis también)
Con la fecha en timestamp para la I.P del usuario cliente y eliminar las filas de la sesión que ya hayan expirado. Si no haces esto probablemente si un usuario ha estado navegando por tu foro, y lo abandona para navegar por tu web en ASP, al volver, al no actualizar el tiempo de sesión se le supondrá desconectado.
Bueno hay una serie de cosillas que te quisiera además comentar, en la tabla phpbb_sessions, se registran todos los usuarios que entran al foro, algunos son usuarios registrados, y otros no, los que tienen identificador -1 son usuarios invitados. Cuando un usuario (invitado o registrado) entra la primera vez(o sea no está esa I.P en la tabla) se inserta además el valor session_start, que contiene la fecha en timestamp del primer acceso a la sesión. Si un usuario se loguea, la sesión de invitado debería de desaparecer, y si se 'desloguea' debería de desaparecer su sesión de usuario(con su session_user_id de usuario que ya sabemos que se diferencia de la de anonimo que es -1 siempre) pero aparecer una sesión de usuario anónimo con esa I.P.