本文描述的代码在 FireBird 2.5 和 2.6 上均可使用.
修改代码由 Luzi 于 Sat Oct 24 14:25:05 1998 在 BBS 水木清华站 开发并运行.
=========================================================================
为了维持代码原有的用户信息结构不变,
因此用户的离线时间记录在用户的 home 目录下的 exit 文件中.
bbs_src/bbs.c 里增加两个函数 get_exit_time 和 record_exit_time
bbs_src/talk.c 和 bbs_src/chat.c 里各增加一处调用 get_exit_time 的语句,
并判断若获得的离线时间早于上次上线时间,则显示“因在线上或非常断线不详”.
此外,如果被查询者在线但是隐身中,查询结果是:
具有看隐身者权限的用户,显示被查询者在线上,
没有看隐身者权限的用户,若被查询者有非隐身窗口,那么显示其在线上,
否则显示其上次的离站时间.
=========================================================================
bbs_src/bbs.c 中添加的函数:
time_t get_exit_time(id,exittime) /* 获取离线时间,id:用户ID,
exittime:保存返回的时间,结束符为\n
建议定义为 char exittime[40]
Luzi 1998/10/23 */
/* Leeward 98.10.26 add return value: time_t */
char *id;
char *exittime;
{
char path[80];
FILE *fp;
time_t now = 1; /* if fopen failed return 1 -- Leeward */
sethomefile( path, id , "exit");
fp=fopen(path, "rb");
if (fp!=NULL)
{
fread(&now,sizeof(time_t),1,fp);
fclose(fp);
strcpy(exittime, ctime(&now));
}
else exittime[0]='\n';
return now;
}
void record_exit_time() /* 记录离线时间 Luzi 1998/10/23 */
{
char path[80];
FILE *fp;
time_t now;
sethomefile( path, currentuser.userid , "exit");
fp=fopen(path, "wb");
if (fp!=NULL)
{
now=time(NULL);
fwrite(&now,sizeof(time_t),1,fp);
fclose(fp);
}
}
=========================================================================
bbs_src/talk.c 中 t_query 函数:
添加变量定义:char exittime[40];
time_t exit_time,temp/*Haohmaru.98.12.04*/;
添加代码:
/* 获得离线时间 Luzi 1998/10/23 */
exit_time = get_exit_time(lookupuser.userid,exittime);
if( (newline = strchr(exittime, '\n')) != NULL )
*newline = '\0';
if (exit_time <= lookupuser.lastlogin
|| (uin.active && uin.pid
&& (!uin.invisible || (uin.invisible && HAS_PERM(PERM_SEECLOAK)))))
strcpy(exittime,"因在线上或非常断线不详");
if (exit_time <= lookupuser.lastlogin
&& (uin.invisible&& !HAS_PERM(PERM_SEECLOAK)))
{
temp=lookupuser.lastlogin+5;
strcpy(exittime,ctime(&temp));/*Haohmaru.98.12.04.让隐身用户看上去
离线时间比上线时间晚5秒钟*/
if( (newline = strchr(exittime, '\n')) != NULL )
*newline = '\0';
}
prints( "\n上次在 [%s] 从 [%s] 到本站一游。\n离线时间[%s] ", genbuf,
(lookupuser.lasthost[0] == '\0' ? "(不详)" : lookupuser.lasthost),
exittime);
=========================================================================
bbs_src/chat.c 中 call_query 函数:
添加变量定义:time_t exit_time,temp;
添加代码:
/* 获得离线时间 Luzi 1998/10/23 */
exit_time = get_exit_time(lookupuser.userid,genbuf);
if( (newline = strchr(genbuf, '\n')) != NULL )
*newline = '\0';
if (exit_time > lookupuser.lastlogin) strcpy(inbuf,genbuf);
/*Haohmaru.98.12.04.和菜单查询结果一致*/
if (exit_time <= lookupuser.lastlogin
|| (uin.active && uin.pid
&& (!uin.invisible || (uin.invisible && HAS_PERM(PERM_SEECLOAK)))))
strcpy(inbuf,"因在线上或非常断线不详");
if (exit_time <= lookupuser.lastlogin
&& (uin.invisible&& !HAS_PERM(PERM_SEECLOAK)))
{
temp=lookupuser.lastlogin+5;
strcpy(inbuf,ctime(&temp));/*Haohmaru.98.12.04.让隐身用户看上去
离线时间比上线时间晚5秒钟*/
if( (newline = strchr(inbuf, '\n')) != NULL )
*newline = '\0';
}
/* else strcpy(inbuf,"[因非常断线不详]");*/
sprintf(genbuf, "离线时间为 %s \n",inbuf);
printchatline(genbuf);
=========================================================================
WWW 代码也有相应的若干修改.
本站的 WWW 代码已经公开在
http://bbs.net.tsinghua.edu.cn/BBSMan_Dev/SMTH-WWW.tgz里面已经包含了所有的修改.
详细介绍请参看本版 SMTH-009 本站 WWW 服务代码 系列文章.
具体说,WWW 代码进行下列相应修改:
bbs2www/bbsquery.c 的 main 函数中添加下列代码块(和相应变量定义):
/* Leeward 98.10.24 */
sethomefile(exittime, lookupuser.userid, "exit");
if (fpe = fopen(exittime, "r")) {
fread(&now, sizeof(time_t), 1, fpe);
fclose(fpe);
strcpy(exittime, ctime(&now));
} else exittime[0] = '\n';
if ( (newline = strchr(exittime, '\n')) != NULL ) *newline = '\0';
search_ulist(&uin, t_cmpuids, getuser(lookupuser.userid));
if (now < lookupuser.lastlogin
|| (uin.active && uin.pid && !uin.invisible))
strcpy(exittime,"因在线上或异常断线不详");
printf("离线时间 [%s] ", exittime);
PS: WWW 查询时,并没有引入“查询者ID的概念”:PP
所以正在隐身上站的人被查时将不显示“在线上”字样----
无论进行查询的人是否具有“可见隐身”的权限。
此外,WWW 代码中修改上线时间的同时,均修改离线时间为上线时间之后一秒:P
修改均按照下列形式:
/* Leeward 98.10.26 */
sprintf(exitfile, "home/%c/%s/exit", toupper(ID[0]), ID);
if (- 1 == (fh = open(exitfile, O_WRONLY|O_CREAT, 0644))) {
printf(":Err: failed login exit time for userid %s\n", ID );
} else {
record.lastlogin ++;
write(fh, &record.lastlogin, sizeof(record.lastlogin));
close(fh);
}
上述修改分别作用于:
bbs2www/bbsmail.c 的 updateuserec 函数;
bbs_src/local_utl/bbspost.c 的 check_userec 函数。
=========================================================================
bbs_src/bbspop3d.c 因为不修改用户信息,所以未作任何修改。
--
修改:Leeward FROM zyu.ne.mediaone
FROM 24.128.196.222