【 以下文字转载自 Advice 讨论区 】
寄信人: oldbug (白发魔男)
标 题: 关于查询用户显示信件的一个修改建议(转寄)
发信站: BBS 水木清华站 (Sat Sep 18 23:31:05 2004)
来 源: 218.182.114.48
【 以下文字转载自 oldbug 的信箱 】
发信人: oldbug (白发魔男), 信区: sysop
标 题: 关于查询用户显示信件的一个修改建议
发信站: BBS 水木清华站 (Sat Sep 18 23:17:34 2004), 站内
我查阅了smthbbs1.2.1的代码,证明了我的猜想,即查询用户状态的时候,是否
有信件是专门去mail部分查询的,需要打开mail文件,参见chat.c的
static void query_user(chatcontext * pthis, const char *userid)
其中定义了
char qry_mail_dir[STRLEN], inbuf[STRLEN * 2];
...
setmailfile(qry_mail_dir, lookupuser->userid, DOT_DIR);
/*--- modified by period 2000-11-02 hide posts/logins ---*/
#ifdef _DETAIL_UINFO_
sprintf(genbuf, "%s (%s): %s", lookupuser->userid,
lookupuser->username,
(check_query_mail(qry_mail_dir) == 1) ? "有新信" : " ");
~~~~~~~~~~~~~~~~~这里是瓶颈所在,因为在具体该函数中去访问了
mail列表文件(bbs_sendmail.c中)
针对该问题,我提出如下建议:
1。struct userec中加入new_mail_count字段
2。重写qry_mail_dir函数,接受参数struct userec *,查询new_mail_count
3。do_send do_gsend doforward doforward函数如果发送成功,则接收者的
new_mail_count++
4。当然,当阅读了信件之后,new_mail_count--
5。不知道是否可以relogon生效,不过可以暂时规定用户logon之后去读mail列表
查是否有信,然后再靠new_mail_count查询是否有信件。PS:需要增加一个变量去
标示用户第一次logon
对了,ctrl-a用的是talk.c,不过原理也一样
这个应该不难,我这里没有linux环境,技术站务们考虑一下吧
--
FROM 218.182.114.*