在 firebird 2k 系列应该都可以的.
讯息记录功能是指分别记录每个ID的讯息以方便察看啦...
这里存储方式是: 对于 ID xx 来说, xx 与 yy 的讯息存在
$BBSHOME/home/X/xx/msg/yy 中, 此文件为文本文件.
$BBSHOME/home/X/xx/msg 为新建的,若无的话会自动建立,
由 $BBSHOME/home/X/xx/msg/.dir 来索引, 此文件结构见后面的 struct msg{}
1. 记录讯息
这个比较简单啦, 可以参考以下函数:
int log_msg(char *me, char *id, char *msg)
{
char buf[128], file[128], dir[128];
struct msg m;
FILE *fp;
int fd;
sethomefile(buf, me, "msg");
if(!dashd(buf))
mkdir(buf, 0755);
sprintf(file, "%s/%s", buf, id);
sprintf(dir, "%s/.dir", buf);
fp = fopen(file, "a+");
if(fp == NULL)
return -1;
fputs(msg, fp);
fclose(fp);
fd = open(dir, O_RDWR | O_CREAT, 0644);
if(fd == -1)
return -1;
while(read(fd, &m, sizeof(m))) {
if(!strcmp(m.userid, id)) {
close(fd);
return 0;
}
}
lseek(fd, 0, SEEK_END);
memset(&m, 0, sizeof(m));
strcpy(m.userid, id);
write(fd, &m, sizeof(m));
close(fd);
return 0;
}
/* end log_msg() */
把上面的函数放到 sendmsg.c 的最后, 然后再更改 do_sendmsg() :
if (mode == 2 || (mode == 0 && msgstr == NULL)) {
if (ishelo == 0) {
sethomefile(buf, currentuser.userid, "msgfile.me");
file_append(buf, mymsg);
+ log_msg(currentuser.userid, uident, mymsg);
}
}
sethomefile(buf, uident, "msgfile.me");
file_append(buf, msgbuf);
+ log_msg(uident, currentuser.userid, msgbuf);
free(mymsg);
=== 这就解决了记录讯息...
2. 察看讯息
更改 comm_lists.c 中的sysconf_cmdlist[] , 在适当位置加入
{"MsgRead", "@mod:so/msg.so#msg_read", 1}
在 modetype.c 中增加
case MSGREAD:
return "双向讯息";
在 include/struct.h 中加
struct msg {
char userid[IDLEN + 2]; //
char reserve[STRLEN]; //没用到,仅作保留.
};
在 modes.h 中加
#define MSGREAD 91 //此数字由你决定啦
最后, 把最后面的代码存为 msg.c
用以下命令编译:
gcc -O -I../../include/ -c msg.c
ld -s -L../../lib -lBBS -G msg.o -o msg.so
然后 cp msg.so /home/bbs/so/
还是看不了? 那 vim /home/bbs/etc/menu.ini 在特别服务那加入:
@MsgRead 0, 0, PERM_POST, "MsgRead", "(M) 双向讯息"
按~~~~~
/*
$Id: msg.c,v 1.1 2003/12/18 08:15:26 hace Exp $
*/
#include "bbs.h"
char *msg_doentry(int ent, struct msg *m)
{
static char buf[STRLEN];
char p[STRLEN], t[STRLEN];
struct stat st;
time_t tt;
sprintf(p, BBSHOME "/home/%c/%s/msg/%s", toupper(currentuser.userid[0]),
currentuser.userid, m->userid);
stat(p, &st);
tt = st.st_mtime;
strcpy(t, ctime(&tt) + 4);
t[20] = 0;
sprintf(buf, " %4d %-12s %-s", ent, m->userid, t);
return buf;
}
int msg_more(int ent, struct msg *m, char *direct)
{
char p[STRLEN];
clear();
sprintf(p, BBSHOME "/home/%c/%s/msg/%s", toupper(currentuser.userid[0]),
currentuser.userid, m->userid);
ansimore(p, YEA);
return FULLUPDATE;
}
void msg_title()
{
move(0, 0);
prints("[双向讯息查看]\n");
prints("[←,e] 离开 [h] 求助 [ →,Rtn] 查看讯息[↑,↓] 选择[ d] 删除讯息\n");
prints(" %4s %-12s %-s\n", "编号", "ID", "最后收发时间");
}
struct one_key msg_list[] = {
'r', msg_more,
'\0', NULL
};
int msg_read()
{
char buf[STRLEN];
char tmp[STRLEN];
sprintf(buf, BBSHOME "/home/%c/%s/msg/.dir", toupper(currentuser.userid[0]),
currentuser.userid );
refresh();
clrtobot();
strcpy(tmp, currboard);
i_read(MSGREAD, buf, msg_title, msg_doentry, msg_list, sizeof(struct msg));
strcpy(currboard, tmp);
clear();
return 1;
}
/* end msg.c */
--