From 085c9a93cf63c5511f28005deb06f8ba25c8b667 Mon Sep 17 00:00:00 2001 From: wens Date: Tue, 8 Mar 2005 16:18:04 +0000 Subject: add "cool down" feature for boards. git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@2582 63ad8ddf-47c3-0310-b6dd-a9e9d9715204 --- mbbsd/bbs.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mbbsd/board.c | 23 ++++++++++++++++++++++ mbbsd/cache.c | 9 +++++++++ mbbsd/mail.c | 13 ++++++++++++ 4 files changed, 108 insertions(+) (limited to 'mbbsd') diff --git a/mbbsd/bbs.c b/mbbsd/bbs.c index d8da50b0..43d6e2aa 100644 --- a/mbbsd/bbs.c +++ b/mbbsd/bbs.c @@ -551,6 +551,15 @@ do_general(int isbid) vmsg("你不夠資深喔!"); return FULLUPDATE; } + +#ifdef USE_COOLDOWN + if ( !((currmode & MODE_BOARD) || HAS_PERM(PERM_SYSOP)) && + ((currbrdattr & BRD_COOLDOWN) && now < cooldowntimeof(usernum)) ) { + move(5, 10); + vmsg("冷靜一下吧!"); + return FULLUPDATE; + } +#endif #endif #ifdef NO_WATER_POST @@ -767,6 +776,10 @@ do_general(int isbid) } if (currbrdattr & BRD_ANONYMOUS) do_crosspost("UnAnonymous", &postfile, fpath); +#ifdef USE_COOLDOWN + if (currbrdattr & BRD_COOLDOWN) + add_cooldowntime(usernum, 5); +#endif } pressanykey(); return FULLUPDATE; @@ -1042,6 +1055,15 @@ cross_post(int ent, fileheader_t * fhdr, char *direct) return FULLUPDATE; } +#ifdef USE_COOLDOWN + if ( !((currmode & MODE_BOARD) || HAS_PERM(PERM_SYSOP)) && + ((bcache[author - 1].brdattr & BRD_COOLDOWN) && now < cooldowntimeof(usernum)) ) { + move(5, 10); + vmsg("冷靜一下吧!"); + return FULLUPDATE; + } +#endif + ent = 1; author = 0; if (HAS_PERM(PERM_SYSOP) || !strcmp(fhdr->owner, cuser.userid)) { @@ -1103,6 +1125,10 @@ cross_post(int ent, fileheader_t * fhdr, char *direct) bp = getbcache(getbnum(xboard)); if (!xfile.filemode && !(bp->brdattr & BRD_NOTRAN)) outgo_post(&xfile, xboard, cuser.userid, cuser.username); +#ifdef USE_COOLDOWN + if (bp->brdattr & BRD_COOLDOWN) + add_cooldowntime(usernum, 5); +#endif setbtotal(getbnum(xboard)); cuser.numposts++; UPDATE_USEREC; @@ -1951,6 +1977,10 @@ del_post(int ent, fileheader_t * fhdr, char *direct) if (not_owned && tusernum && fhdr->multi.money > 0 && strcmp(currboard, "Test")) { deumoney(tusernum, -fhdr->multi.money); +#ifdef USE_COOLDOWN + if (bp->brdattr & BRD_COOLDOWN) + add_cooldowntime(tusernum, 15); +#endif } if (!not_owned && strcmp(currboard, "Test")) { if (cuser.numposts) @@ -2560,6 +2590,35 @@ change_restrictedpost(int ent, fileheader_t * fhdr, char *direct){ return FULLUPDATE; } +#ifdef USE_COOLDOWN +/** + * 設定看板冷靜功能, 限制使用者發文時間 + */ +static int +change_cooldown(int ent, fileheader_t * fhdr, char *direct) +{ + boardheader_t *bp = getbcache(currbid); + + if (!HAS_PERM(PERM_SYSOP)) + return DONOTHING; + + if (bp->brdattr & BRD_COOLDOWN) { + if (getans("目前降溫中, 要開放嗎(y/N)?") != 'y') + return FULLUPDATE; + bp->brdattr &= ~BRD_COOLDOWN; + outs("大家都可以 post 文章了。\n"); + } else { + if (getans("要限制 post 頻率, 降溫嗎(y/N)?") != 'y') + return FULLUPDATE; + bp->brdattr |= BRD_COOLDOWN; + outs("開始冷靜。\n"); + } + substitute_record(fn_board, bp, sizeof(boardheader_t), currbid); + pressanykey(); + return FULLUPDATE; +} +#endif + /* ----------------------------------------------------- */ /* 看板功能表 */ /* ----------------------------------------------------- */ @@ -2567,7 +2626,11 @@ change_restrictedpost(int ent, fileheader_t * fhdr, char *direct){ const onekey_t read_comms[] = { show_filename, // Ctrl('A') NULL, // Ctrl('B') +#ifdef USE_COOLDOWN + change_cooldown, // Ctrl('C') +#else NULL, // Ctrl('C') +#endif NULL, // Ctrl('D') change_restrictedpost, // Ctrl('E') NULL, // Ctrl('F') diff --git a/mbbsd/board.c b/mbbsd/board.c index 3fb53483..ff3fb610 100644 --- a/mbbsd/board.c +++ b/mbbsd/board.c @@ -192,6 +192,23 @@ addnewbrdstat(int n, int state) static int cmpboardfriends(const void *brd, const void *tmp) { +#ifdef USE_COOLDOWN + if ((B_BH((boardstat_t*)tmp)->brdattr & BRD_COOLDOWN) && + (B_BH((boardstat_t*)brd)->brdattr & BRD_COOLDOWN)) + return 0; + else if ( B_BH((boardstat_t*)tmp)->brdattr & BRD_COOLDOWN ) { + if (B_BH((boardstat_t*)brd)->nuser == 0) + return 0; + else + return 1; + } + else if ( B_BH((boardstat_t*)brd)->brdattr & BRD_COOLDOWN ) { + if (B_BH((boardstat_t*)tmp)->nuser == 0) + return 0; + else + return -1; + } +#endif return ((B_BH((boardstat_t*)tmp)->nuser) - (B_BH((boardstat_t*)brd)->nuser)); } @@ -543,7 +560,13 @@ show_brdlist(int head, int clsflag, int newflag) B_BH(ptr)->title[3] + B_BH(ptr)->title[0]) & 07], B_BH(ptr)->title, B_BH(ptr)->title + 5, B_BH(ptr)->title + 7); +#ifdef USE_COOLDOWN + if (B_BH(ptr)->brdattr & BRD_COOLDOWN) + outs("靜 "); + else if (B_BH(ptr)->brdattr & BRD_BAD) +#else if (B_BH(ptr)->brdattr & BRD_BAD) +#endif outs(" X "); else if (B_BH(ptr)->nuser >= 5000) outs("\033[1;34m爆!\033[m"); diff --git a/mbbsd/cache.c b/mbbsd/cache.c index 4933339f..d32d7f15 100644 --- a/mbbsd/cache.c +++ b/mbbsd/cache.c @@ -1031,3 +1031,12 @@ hbflcheck(int bid, int uid) } return 1; } + +#ifdef USE_COOLDOWN +void add_cooldowntime(int uid, int min) +{ + time4_t new = now + 60 * min; + time4_t old = SHM->cooldowntime[uid - 1]; + SHM->cooldowntime[uid - 1] = new > old ? new : old; +} +#endif diff --git a/mbbsd/mail.c b/mbbsd/mail.c index 5d4ba3b3..7d953388 100644 --- a/mbbsd/mail.c +++ b/mbbsd/mail.c @@ -1053,6 +1053,15 @@ mail_cross_post(int ent, fileheader_t * fhdr, char *direct) return FULLUPDATE; } +#ifdef USE_COOLDOWN + if ( !((currmode & MODE_BOARD) || HAS_PERM(PERM_SYSOP)) && + ((bcache[ent - 1].brdattr & BRD_COOLDOWN) && now < cooldowntimeof(usernum)) ) { + move(5, 10); + vmsg("冷靜一下吧!"); + return FULLUPDATE; + } +#endif + ent = 1; if (HAS_PERM(PERM_SYSOP) || !strcmp(fhdr->owner, cuser.userid)) { getdata(2, 0, "(1)原文轉載 (2)舊轉錄格式?[1] ", @@ -1117,6 +1126,10 @@ mail_cross_post(int ent, fileheader_t * fhdr, char *direct) setbtotal(getbnum(xboard)); if (!xfile.filemode) outgo_post(&xfile, xboard, cuser.userid, cuser.username); +#ifdef USE_COOLDOWN + if (bcache[getbnum(xboard) - 1].brdattr & BRD_COOLDOWN) + add_cooldowntime(usernum, 5); +#endif cuser.numposts++; vmsg("文章轉錄完成"); currmode = currmode0; -- cgit v1.2.3