回文章列表
作者cache.bbs@cpu.tfcis.org (make OK!) 看板: itoc
標題[功能] 優劣文
時間動力核心 (2009/06/09 Tue 11:56:25)
感覺對小站的影響力比較沒有那麼大
不過鼓勵優良文章的作者和討論風氣卻是非常有意義的 :P


src/util/tran/transacct.c

在做這個功能之前必須先要先對全站帳號執行 transacct
在 struct NEW 新增下面兩行

+  int goodart;          /* 優文 */
+  int badart;           /* 劣文 */

修改完後執行 transacct 進行轉換


src/include/battr.h

+ #define BRD_EVALUATE    0x0400  /* 優劣文看板 */

! #define NUMBATTRS       11
! #define STR_BATTR       "zTcsvA%fpuE"

  "發文文章類別",       /* BRD_PREFIX */
  "觀看進板記錄",       /* BRD_USIES*/
! "優劣文看板"          /* BRD_EVALUATE*/


src/include/struct.h: ACCT struct

  int bmw_count;
  #endif

+ int goodart;          /* 優文 */
+ int badart;           /* 劣文 */
  };


src/maple/bbsd.c: void u_exit()

+ cuser.goodart = cutmp->goodart;
+ cuser.badart = cutmp->badart;
  cuser.userlevel = tuser.userlevel;
  cuser.tvalid = tuser.tvalid;


src/maple/bbsd.c: static void utmp_setup ()

  strcpy(utmp.userid, cuser.userid);
+ utmp.goodart = cuser.goodart;
+ utmp.badart = cuser.badart;
  #ifdef DETAIL_IDLETIME
  utmp.idle_time = ap_start;


src/maple/bbsd.c: acct_apply()

  sprintf(cuser.email, "%s.bbs@%s", cuser.userid, str_host);

+ cuser.goodart = 0;   //新使用者優劣文皆0篇
+ cuser.badart = 0;
+
  /* Ragnarok.050528: 可能二人同時申請同一個 ID,在此必須再檢查一次 */
  usr_fpath(buf, userid, NULL);


src/maple/bbsd.c: static int post_mark ()

改寫成m文時詢問是否設為優文

static int
post_mark(xo)
  XO *xo;
{
  if (bbstate & STAT_BOARD)
  {
    HDR *hdr;
    int pos, cur, xmode, userno;;
    char ans,buf[40];

    pos = xo->pos;
    cur = pos - xo->top;
    hdr = (HDR *) xo_pool + cur;
    xmode = hdr->xmode;

    BRD *oldbrd, newbrd;
    oldbrd = bshm->bcache + currbno;
    memcpy(&newbrd, oldbrd, sizeof(BRD));

    //cache.090602: 核定優文
    if(newbrd.battr & BRD_EVALUATE)
      {
         if(hdr->xmode & POST_MARKED)
           {
             hdr->xmode = xmode ^ POST_MARKED;
             currchrono = hdr->chrono;
             rec_put(xo->dir, hdr, sizeof(HDR), xo->key == XZ_XPOST ? hdr->xid : pos, cmpchrono);
             move(3 + cur, 7);
             outc(post_attr(hdr));
             ans = vans("◎ 是否將本篇取消優文 Y)是 N)否 ?(預設=否) ");

             if(ans == 'y' || ans == 'Y')
               {
                 if((userno = acct_userno(hdr->owner)) > 0)
                   {
                      extern UCACHE *ushm;
                      int online = 0;
                      UTMP *uentp, *uceil;
                      uentp = ushm->uslot;
                      uceil = (void *) uentp + ushm->offset;
                      do
                        {
                           if(uentp->userno == userno)
                             {
                             /* 在線上,寫入 utmp-> */
                               if(uentp->goodart > 0)
                                 uentp->goodart--;
                               online = 1;
                               sprintf(buf, "設定完畢! %s 優文篇數減為 %d 篇。", uentp->userid, uentp->goodart);
                             }
                        } while (++uentp <= uceil);

                      if(online)
                         vmsg(buf);
                      else        /* 不在線上,寫入 .ACCT (thanks to gaod) */
                        {
                           ACCT acct;
                           if(acct_load(&acct, hdr->owner) >= 0)
                             {
                                if(acct.goodart > 0)
                                  acct.goodart--;
                                acct_save(&acct);
                                sprintf(buf, "設定完畢! %s 優文篇數減為 %d 篇。", acct.userid, acct.goodart);
                                vmsg(buf);
                             }
                        }//if online
                   }//if userno
               }//if ans
           }//if MARKED
         else
           {
             hdr->xmode = xmode ^ POST_MARKED;
             currchrono = hdr->chrono;
             rec_put(xo->dir, hdr, sizeof(HDR), xo->key == XZ_XPOST ? hdr->xid : pos, cmpchrono);
             move(3 + cur, 7);
             outc(post_attr(hdr));

             ans = vans("◎ 是否將本篇設為優文 Y)是 N)否 ?(預設=否) ");
             if(ans == 'y' || ans == 'Y')
               {
                 if((userno = acct_userno(hdr->owner)) > 0)
                   {
                      extern UCACHE *ushm;
                      int online = 0;
                      UTMP *uentp, *uceil;
                      uentp = ushm->uslot;
                      uceil = (void *) uentp + ushm->offset;
                      do
                        {
                           if(uentp->userno == userno)
                             {
                             /* 在線上,寫入 utmp-> */
                               uentp->goodart++;
                               online = 1;
                               sprintf(buf, "設定完畢! %s 優文篇數增為 %d 篇。", uentp->userid, uentp->goodart);
                             }
                        } while (++uentp <= uceil);

                      if(online)
                        vmsg(buf);
                      else        /* 不在線上,寫入 .ACCT (thanks to gaod) */
                        {
                           ACCT acct;
                           if(acct_load(&acct, hdr->owner) >= 0)
                              {
                                 acct.goodart++;
                                 acct_save(&acct);
                                 sprintf(buf, "設定完畢! %s 優文篇數增為 %d 篇。", acct.userid, acct.goodart);
                                 vmsg(buf);
                              }
                        }//online
                   }//if userno
                }//if ans
            }//else
      }//if EVALUATE

    hdr->xmode = xmode ^ POST_MARKED;
    currchrono = hdr->chrono;
    rec_put(xo->dir, hdr, sizeof(HDR), xo->key == XZ_XPOST ? hdr->xid : pos, cmpchrono);

    move(3 + cur, 7);
    outc(post_attr(hdr));
  }
  return XO_FOOT;
}


src/maple/post.c: post_delete() 

改寫成板主刪文時詢問是否設為劣文

- int pos, cur, by_BM;
+ int pos, cur, by_BM, userno;
  HDR *hdr;
  char buf[80];

  if (!cuser.userlevel ||
    !strcmp(currboard, BN_DELETED) ||
    !strcmp(currboard, BN_JUNK))
    return XO_NONE;

  pos = xo->pos;
  cur = pos - xo->top;
  hdr = (HDR *) xo_pool + cur;

  if ((hdr->xmode & POST_MARKED) || (!(bbstate & STAT_BOARD) && !is_author(hdr)))
    return XO_NONE;

  by_BM = bbstate & STAT_BOARD;

  if (vans(msg_del_ny) == 'y')
  {
    currchrono = hdr->chrono;

+    BRD *oldbrd, newbrd;
+    oldbrd = bshm->bcache + currbno;
+    memcpy(&newbrd, oldbrd, sizeof(BRD));
+    char ans;
+
+    //cache.090602: 劣退文章
+    if((newbrd.battr & BRD_EVALUATE) && (bbstate & STAT_BOARD))
+    {
+       ans = vans("◎ 是否將本篇設為劣文 Y)是 N)否 ?(預設=否) ");
+       if(ans == 'y' || ans == 'Y')
+          {
+             if((userno = acct_userno(hdr->owner)) > 0)
+                {
+                   extern UCACHE *ushm;
+                   int online = 0;
+                   UTMP *uentp, *uceil;
+                   uentp = ushm->uslot;
+                   uceil = (void *) uentp + ushm->offset;
+                   do
+                     {
+                       if(uentp->userno == userno)
+                          {
+                          /* 在線上,寫入 utmp-> */
+                             uentp->badart++;
+                             online = 1;
+                             sprintf(buf, "設定完畢! %s 劣文篇數增為 %d 篇。", uentp->userid, uentp->badart);
+                           }
+                     } while (++uentp <= uceil);
+
+                   if(online)
+                      vmsg(buf);
+                   else        /* 不在線上,寫入 .ACCT (thanks to gaod) */
+                     {
+                        ACCT acct;
+                        if(acct_load(&acct, hdr->owner) >= 0)
+                          {
+                             acct.badart++;
+                             acct_save(&acct);
+                             sprintf(buf, "設定完畢! %s 劣文篇數增為 %d 篇。", acct.userid, acct.badart);
+                             vmsg(buf);
+                          }
+                     }//if online
+                 }//if userno
+           }//if ans
+    }//if battr
+
    if (!rec_del(xo->dir, sizeof(HDR), xo->key == XZ_XPOST ? hdr->xid : pos, cmpchrono))
    {
      pos = move_post(hdr, xo->dir, by_BM, 0);

      if (!by_BM && !(currbattr & BRD_NOCOUNT) && !(hdr->xmode & POST_BOTTOM))


bbs/src/maple/acct.c: void acct_show()

讓使用者查詢的時候會顯示自己的優劣文

! prints("  \033[32m上站次數:\033[37m%-35d\033[32m文章篇數:\033[37m%d
(優:%d/劣:%d)\n", u->numlogins, u->numposts, u->goodart, u->badart);


bbs/src/maple/acct.c: void acct_setup()

讓站務可以修改使用者的優劣文數

    vget(++i, 0, "上站地點:", x.lasthost, sizeof(x.lasthost), GCARRY);
    vget(++i, 0, "郵件信箱:", x.email, sizeof(x.email), GCARRY);
+
+   sprintf(buf, "%d", u->goodart);
+   vget(++i, 0, "優文數目:", buf, 10, GCARRY);
+   if ((num = atoi(buf)) >= 0)
+     x.goodart = num;
+
+   sprintf(buf, "%d", u->badart);
+   vget(++i, 0, "劣文數目:", buf, 10, GCARRY);
+   if ((num = atoi(buf)) >= 0)
+     x.badart = num;


src/maple/talk.c: static void do_query()

查詢網友時會顯示該名使用者的優劣文資訊

+ prints("[成就] 優文 %d 篇/劣文 %d 篇\n", acct->goodart, acct->badart);

  showplans(userid);
  vmsg(NULL);
}


--
=[:摃��:﹎Origin ]|[  Ocpu.tfcis.org  ]|[�搟說:]=
=[:摃�╱�:Author ]|[118-171-140-61.dynamic.hin]|[�:]=
文章選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻