回精華區
作者itoc, 信區: itoc
標題[功能] nouse_brd.c 統計使用率不高的看板
時間04/05/21
作者: itoc (League) 看板: plan
標題: [功能] 統計使用率不高的看板
時間: 2003/12/07 Sun 10:23:58                           Updated: 2005/05/25

: src/util/Makefile

EXE =   ... nouse-brd

: crontab -e 加入

10 4 * * * bin/nouse-brd > /dev/null 2>&1

: src/util/nouse-brd.c 新增程式如下

/*-------------------------------------------------------*/
/* util/nouse_brd.c     ( NTHU CS MapleBBS Ver 3.10 )    */
/*-------------------------------------------------------*/
/* target : 統計使用率不高的看板                         */
/* create : 03/12/06                                     */
/* update :   /  /                                       */
/* author : itoc.bbs@bbs.tnfsh.tn.edu.tw                 */
/*-------------------------------------------------------*/


#include "bbs.h"


static char *Title = "使用率不高的看板";
static char *Brdname = "sysop";         // 看板自定 
static char *ftmp = "tmp/nouse-board";  /* 暫存檔 */

static void
add_post()           /* 發文到看板 */
{
  HDR hdr;
  char folder[64];

  brd_fpath(folder, Brdname, FN_DIR);
  hdr_stamp(folder, HDR_LINK | 'A', &hdr, ftmp);
  strcpy(hdr.owner, STR_SYSOP);
  strcpy(hdr.nick, SYSOPNICK);
  strcpy(hdr.title, Title);
  rec_add(folder, &hdr, sizeof(HDR));
}


static time_t now;
static time_t delta;      /* 最後一篇文章距目前幾天 */
static int page;          /* 有幾篇文章 */

static void
expire(brd)
  BRD *brd;
{
  int fd, fsize;
  char folder[64];
  HDR hdr;
  struct stat st;

  brd_fpath(folder, brd->brdname, FN_DIR);

  if ((fd = open(folder, O_RDONLY)) >= 0 && !fstat(fd, &st))
  {
    fsize = st.st_size;
    page = fsize / sizeof(HDR);

    if (page <= 0)  /* 沒有文章則看開板時間 */
    {
      delta = brd->bstamp;
    }
    else
    {
      delta = brd->bstamp;      /* 避免所有文章都是置底文 */
      while ((fsize -= sizeof(HDR)) >= 0)   /* 找最後一篇不是置底文的時間 */
      {
        lseek(fd, fsize, SEEK_SET);
        read(fd, &hdr, sizeof(HDR));
        if (!(hdr.xmode & POST_BOTTOM))
        {
          delta = hdr.chrono;
          break;
        }
      }
    }
    delta = (now - delta) / 86400;
    close(fd);
  }
}


int
main()
{
  int score;
  FILE *fpr, *fpw;
  BRD brd;

  chdir(BBSHOME);

  if (!(fpr = fopen(FN_BRD, "r")) || !(fpw = fopen(ftmp, "w")))
    return -1;

  time(&now);

  fprintf(fpw, "%s %s (%s) %s %s\n",
    STR_AUTHOR1, STR_SYSOP, SYSOPNICK, STR_POST2, Brdname);
  fprintf(fpw, "標題: %s\n時間: %s\n\n", Title, Btime(&now));

  while (fread(&brd, sizeof(BRD), 1, fpr) == 1)
  {
    if (!*brd.brdname)  /* 此板已被刪除 */
      continue;

    expire(&brd);

    score = page / 5 - delta;    // 公式自定 
    if (score <= -200)
    {
      fprintf(fpw, "%-12s 板 %4d 分,最後一篇文章於 %3d 天前,"
        "總共有 %4d 篇文章\n",
        brd.brdname, score, delta, page);
    }
  }

  fprintf(fpw, "\n--\n※ 本文由自動發文系統所發表\n");

  fclose(fpr);
  fclose(fpw);
  add_post();
  unlink(ftmp);

  return 0;
}


--
□ 本文章由 itocthree.Dorm11.NCTU.edu.tw 發表
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻