回精華區
作者qazq.bbs@bbs.cs.nchu.edu.tw (ξ愛情御守ξ) 看板: plan
標題[功能] 熱門看板排行榜(2)-topbrd.c
時間中興資科 (Mon, 14 Jul 2003 17:08:54 +0800 (CST)) Updated: 2004/06/16
: util/Makefile

EXE = .......
!     ............. topusr topbrd usies-sort


: util/topbrd.c

    新增整支程式,參考 topgem.c 改的。

/*-------------------------------------------------------*/
/* topbrd.c ( NTHU CS MapleBBS Ver 3.10 )                */
/*-------------------------------------------------------*/
/* target : 熱門看板排行榜                               */
/* create : 03/07/03                                     */
/* update : 03/07/03                                     */
/* author : itoc.bbs@bbs.tnfsh.tn.edu.tw                 */
/* modify : qazq.bbs@bbs.cs.nchu.edu.tw                  */
/*-------------------------------------------------------*/



#include "bbs.h"


#define BRD_TIMES   "run/brd_times.log"
#define TOPBRD      "gem/@/@-topbrd"

/*-------------------------------------------------------*/
/* BRD shm 部分須與 cache.c 相容                         */
/*-------------------------------------------------------*/


static BCACHE *bshm;


static void
init_bshm()
{
  /* itoc.030727: 在開啟 bbsd 之前,應該就要執行過 account,
     所以 bshm 應該已設定好 */

  bshm = shm_new(BRDSHM_KEY, sizeof(BCACHE));

  if (bshm->uptime <= 0)        /* bshm 未設定完成 */
    exit(0);
}


static BRD *
brd_get(brdname)
  char *brdname;
{
  BRD *bhdr, *tail;

  bhdr = bshm->bcache;
  tail = bhdr + bshm->number;
  do
  {
    if (!strcmp(brdname, bhdr->brdname))
      return bhdr;
  } while (++bhdr < tail);
  return NULL;
}


typedef struct
{
  int times;            /* 進入看板閱讀次數 */
  char brdname[BNLEN + 1];  /* 板名 */
}   BRDDATA;


static int
int_cmp(a, b)
  BRDDATA *a, *b;
{
  return (b->times - a->times); /* 由大排到小 */
}


int
main()
{
  time_t now;
  struct tm *ptime;
  BRDDATA board[MAXBOARD];
  FILE *fp;
  int locus, i, m;
  BRD *bhdr;

  chdir(BBSHOME);

  if (!(fp = fopen(BRD_TIMES, "r")))
    return;

  locus = 0;
  while (!feof(fp))
  {
    fscanf(fp, "%s%d", board[i].brdname, &(board[i].times));
    locus++;
  }
  fclose(fp);

  qsort(board, locus, sizeof(BRDDATA), int_cmp);

  init_bshm();

  fp = fopen(TOPBRD, "w");

  // 下面是顯示畫面,可以自己畫....看起來和無名小站的有點像...(逃...:P)

  time(&now);
  ptime = localtime(&now);
  fprintf(fp, "        ┤\033[1;41m        熱門看板排行榜        \033[m├"
    "        \033[33m統計日期: \033[36m%d 月 %d 日\033[m\n\n",
    ptime->tm_mon + 1, ptime->tm_mday);

  m = 1;
  for (i = 0; i < locus; i++)
  {
    if (board[i].times == 0)
      break;

    if (!(bhdr = brd_get(board[i].brdname)))   /* 此板已改名或被砍 */
      continue;

    /* 跳過不列入排行榜的看板 */
    /* (BASIC + ... + VALID) < (VALID << 1) */
    if ((bhdr->readlevel | bhdr->postlevel) >= (PERM_VALID << 1))
      continue;

    fprintf(fp, "\033[1;31m%4d. \033[33m看板: \033[32m%-13s  "
      "\033[1;3%dm%5.5s\033[m %-34.33s  \033[1;35m人次 \033[36m%-3d\033[m\n",
      m, board[i].brdname, bhdr->class[3] & 7, bhdr->class,
      bhdr->title, board[i].times);

    m++;
  }

  fclose(fp);
}

: crontab -e 新增

36 3 * * * bin/topbrd > /dev/null 2>&1

    //一定要先過午夜12點才能跑唷!因為要讓 account 跑出 usies-sort

--
| Origin |  中興資科 中興資科 e資獨秀  bbs.cs.nchu.edu.tw 
| Author | 61-216-136-210.HINET-IP.hinet.net
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻