作者itoc.bbs@cpu.tfcis.org (核心動力) 看板: itoc
標題Re: [問題]功能-文章編輯時無法加分
時間動力核心 (2007/04/06 Fri 19:51:56)
post_edit() 裡的 vedit() 前/後,加上/移除 POST_EDITING 旗標
post_score() 在評分前,若發現有 POST_EDITING 旗標,則禁止評分
程式會自動修復當作者編輯不正常斷線時殘留的 POST_EDITING
但是若作者不正常斷線又馬上連線,但不再去編輯該文章時,殘留的 POST_EDITING
程式也不會修復當站長不正常斷線時殘留的 POST_EDITING_AD
此時,只要作者或站長再去 Edit 一次,正常離開編輯即可 (不管有無儲存都可以)
如果作者開二個視窗同時 Edit 同一篇文章
那麼其中一個視窗離開 Edit 後,就可以開始評分了
反正目前也沒管「作者開二個視窗同時 Edit 同一篇文章時,晚儲存會覆蓋先儲存」
所以也不打算寫此情況下的禁止評分檢查
: hdr.h
- #define POST_3 0x00000004
+ #define POST_EDITING 0x00000004 /* editing by author */
- #define POST_4 0x00000008
+ #define POST_EDITING_AD 0x00000008 /* editing by admin */
: post.c:post_edit()
if (HAS_PERM(PERM_ALLBOARD)) /* 站長修改 */
{
...
...
+ do_editing(xo, 1);
vedit(fpath, 0);
+ do_editing(xo, -1);
}
else if (cuser.userlevel && !strcmp(hdr->owner, cuser.userid))
{
+ do_editing(xo, 2);
if (!vedit(fpath, 0))
{
...
...
}
+ do_editing(xo, -2);
}
: post.c:do_editing() 新增此函式在 post_edit() 前面
static void
do_editing(xo, flag)
XO *xo;
int flag;
{
HDR *hdr;
int pos, xmode;
pos = xo->pos;
hdr = (HDR *) xo_pool + (pos - xo->top);
xmode = hdr->xmode;
if (flag == 1)
hdr->xmode = xmode | POST_EDITING_AD;
else if (flag == -1)
hdr->xmode = xmode & ~POST_EDITING_AD;
else if (flag == 2)
hdr->xmode = xmode | POST_EDITING;
else if (flag == -2)
hdr->xmode = xmode & ~POST_EDITING;
currchrono = hdr->chrono;
rec_put(xo->dir, hdr, sizeof(HDR), xo->key == XZ_XPOST ?
hdr->xid : pos, cmpchrono);
}
: post.c:post_score()
pos = xo->pos;
cur = pos - xo->top;
hdr = (HDR *) xo_pool + cur;
+ if (is_editing(xo, hdr))
+ {
+ vmsg("目前作者或站長正編輯此文章中,暫時禁止評分");
+ return XO_FOOT;
+ }
: post.c:is_editing() 新增此函式在 post_score() 前面
static int
is_editing(xo, hdr)
XO *xo;
HDR *hdr;
{
HDR hdd;
int fd;
int rc = 0;
time_t chrono;
/* 由於使用者手上的 xo_pool[] 可能是舊的 (即使用者已經在板內,
這時作者才編輯該文章),所以直接去找硬碟最正確的 */
chrono = hdr->chrono;
if ((fd = open(xo->dir, O_RDONLY)) >= 0)
{
while (read(fd, &hdd, sizeof(HDR)) == sizeof(hdd))
{
if (chrono == hdd.chrono)
{
rc = (hdd.xmode & (POST_EDITING | POST_EDITING_AD));
break;
}
}
close(fd);
}
if (rc & POST_EDITING_AD) /* 有站長正在編輯 */
return 1;
/* 若本文章只有 POST_EDITING,再檢查作者是否在站上 */
if (rc)
{
extern UCACHE *ushm;
UTMP *uentp, *uceil;
uentp = ushm->uslot;
uceil = (void *) uentp + ushm->offset;
do
{
if (!strcmp(uentp->userid, hdd.owner))
return 1;
} while (++uentp <= uceil);
}
/* 若只有 POST_EDITING,但作者不在站上,
表示作者不正常斷線,移除 POST_EDITING */
do_editing(xo, -2);
return 0;
}
--
=[﹎:�摃�◣��:﹎ Origin ]|[ ���O���� cpu.tfcis.org ]|[�搟說�﹎:]=
=[﹊:�摃�╱��:﹊ Author ]|[218-168-186-195.dynamic.hi]|[���插�﹊:]=
= ▊▌▎▎Modify ▎▌▋▊▊≡: Fri, 06 Apr 2007 19:52:22 CST :≡:]=