回文章列表
作者Dopin.bbs@bbs.bsd.com.tw (系統調校完成) 看板: installbbs
標題SOB 選擇式更新 -- 看板人氣 (1) 基本使用
時間亞特蘭提斯 (2009/12/11 Fri 02:05:39)
// 基本上本 patch 單純就是讓人氣可以顯示與運作 不含統計與其他功能 Orz

// 適用版本 maple 2.36 / SOB 2009/12/09(含) 以前的版本 / 其他 SOB 家族

                            [重要 !! 在 patch 之前] 

ve src/maple/abc.c (或取任何一個不會跟目錄中檔案重疊的 "name.c")

/* 從這開始新增檔案 */
#include "bbs.h"

/* 請 "務必" 拷貝 struct.h 中的 boardheader 到下面 此為範例 */

struct boardheader_n {
  char brdname[IDLEN + 1];      /* bid */
  char title[BTLEN - 1];
  short readers;    // 如果需要定義成 int 則 title 要再減 2 但不建議 
  char BM[IDLEN * 3 + 3];       /* BMs' uid, token '/' */
  char yankflags[11];           /* Dopin: for extra_mode */
  time_t bupdate;               /* note update time */
  char outgo_mode;              /* usenet outgo mode */
  char pad2[2];
  uschar bvote;                 /* Vote flags */
  time_t vtime;                 /* Vote close time */
  usint level;
};
typedef struct boardheader_n boardheader_n;

int main(void) {
  printf("Old %d ; New %d\n", sizeof(boardheader), sizeof(boardheader_n));

  return 0;
}
/* 到這裡 */

bbs<home:/home/bbs/src/maple> make abc ; ./abc
cc -O -pipe   abc.c  -o abc
Old 128 ; New 128
bbs<home:/home/bbs/src/maple>

    /* 請注意 新舊 boardheader 的大小一定要調到 New 跟 Old 一樣才可以用 */

                      [完全確定結構大小沒問題 再開始動工] 

bbs<home:/home/bbs/src/maple> rm abc*  // 砍掉剛剛的測試程式 不砍也行 

// src/maple/struct.h  // 請依貴站經上述動作調整好之實際狀況修改 

struct boardheader {
  char brdname[IDLEN + 1];      /* bid */
  char title[BTLEN - 1];
  short readers;                /* count readers */
  char BM[IDLEN * 3 + 3];       /* BMs' uid, token '/' */
  ...
};

// src/maple/admin.c   // 避免以後開看板變更看板破表 

int m_newbrd() {
  ...

  if(boardname) strcpy(newboard.title, brdcname);
  else getdata(2, 0, "看板主題: ", newboard.title, BTLEN - 1, DOECHO, 0);

  ...
}

int m_board() {
  ...

    if(getdata(12, 0, "新的看板說明: ", genbuf, BTLEN - 1, DOECHO,
       newbh.title)) strcpy(newbh.title, genbuf);

  ...
}

// 如果發現到 現存的看板 有的中文板名很長 要記得修改 以免蓋到新欄位 

// src/maple/bbs.c

int Read() {
  char buf[40];
  int mode0 = currutmp->mode;
  int stat0 = currstat;
  time_t usetime;
  boardheader *bp;    // 請檢查是否有這兩行敘述 沒有請加上 

  if(!(bp = getbcache(currboard))) return -1;

  ...

  brc_initial(currboard);

  if(bp->readers < 0)     bp->readers = 0;
  if(bp->readers < 30000) bp->readers++;  // short 極值 32767 這樣定應該安全 

  /* Dopin: 加入判斷 以免站長沒進去看板裡也被系統記錄 */
  if(i_read(READING, buf, readtitle, readdoent, read_comms)) {
    log_board(currboard, time(0) - usetime);
    brc_update(currboard);
  }

  if(bp->readers > 0) bp->readers --;
  else                bp->readers = 0;

  ...
}

// menu.c

void showtitle(title, mid1)
  char *title, *mid1;
{
  char buf[40], *mid, midbuf[TTLEN], readers[16] = "";
  int spc, pad;
  boardheader *bp = NULL;

  if(currstat == READING)
    if(bp = getbcache(currboard)) { // 多少算人數破表可以自己改 這裡是 9999 
      if(bp->readers > 99999) sprintf(readers, "人氣: 破 表 ");
      else                    sprintf(readers, "人氣: %-4d ", bp->readers);
    }
    else return;

  mid = strcpy(midbuf, mid1);

  ...

  }

  if(currstat == READING)  // 預設最高人數是四位數 0000 位數有變更格式要改 
    spc = 66-strlen(title)-spc-strlen(currboard)-strlen(" 人氣: 0000 ");
  else
    spc = 66 - strlen(title) - spc - strlen(currboard);

  /* woju */

  ...

  clear();
  prints("*[1;44;37m【%s】%s*[33m%s%s%s%s*[3%s《%s》*[0m\n",
    title, buf, mid, buf, " " + pad, readers,
    currmode & MODE_SELECT ? "6m系列" : currmode & MODE_ETC ? "5m其他" :
    currmode & MODE_DIGEST ? "2m文摘" : "7m看板", currboard);
}

// 這樣修改後就會以如下的效果 :

【板主:徵求中】             沙質測試……             人氣: 1    看板《Test》
[←]離開 [→]閱讀 [^P]發表文章 [b]備忘錄 [d]刪除 [z]精華區 [TAB]文摘 [h]elp
  編號   日 期  作  者       文  章  標  題                                   
●   1   10/09 1SYSOP        □ 本板功能

// 祝變更愉快 切務注意一定要比對過新舊的 boardheader 才動工 否則要轉換結構

--
Origin: Atlantis  DN: bbs.bsd.com.tw  IP : 203.70.65.27  ST: atlantis       
文章選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻