回精華區
作者amaki.bbs@luna.twbbs.org (灑羊奶轉圈圈) 看板: plan
標題[功能]看板人氣、瀏覽時間、CP排行與統計~4
時間月下夜想 (Sat, 16 Aug 2003 10:10:37 +0800 (CST)) Updated: 2003/12/18
  util/下新增這隻 brdcounter.c


/*-------------------------------------------------------*/
/* util/brdcounter.c         (MapleBBS Ver 3.10 )        */
/*-------------------------------------------------------*/
/* target : 當日看板二十四小時統計圖                     */
/* create : 03/07/22                                     */
/* author : amaki.bbs@luna.twbbs.org                     */
/*-------------------------------------------------------*/

#include  "bbs.h"

static BCACHE *bshm;

typedef struct
{
  int d_mantime[31];
  int w_mantime[7];
  int m_mantime[12];
  int hr_mantime[24];

  long int d_time[31];
  long int w_time[7];
  long int m_time[12];
  long int hr_time[24];

  int d_cp[31];
  int w_cp[7];
  int m_cp[12];
  int hr_cp[24];
} DATA;


typedef struct
{
  int year;
  int yday;
  int mon;
  int mday;
  int hour;
} DATE;

static int hr_data[24];


static void
hr_draw(brd, now, old, fn_name, bno, t_deg, key)
  BRD *brd;
  DATE *now, *old;
  char *fn_name, *t_deg;
  int bno, key;
{
  int max = 0, unit, deg, res, i = 0, j = 0;
  FILE *fp;
  HDR post;
  char fpath[64], folder[64], buf[80];
  char *block[11] =
  {
    "  ", "_", "▁", "▂", "▃", "▄", "▅", "▆", "▇", "█", "█"
  };

  for (i = 0; i < old->hour + 1; i++)
  {
    if (hr_data[i] > max)
      max = hr_data[i];
  }

  brd_fpath(fpath, brd->brdname, fn_name);
  fp = fopen(fpath, "w");

  if (max > 18)
    unit = (max % 19) ? (max / 19) + 1 : max / 19;
  else
    unit = 1;

  if (key == 1)
    fprintf(fp, "\033[1m%-12s\033[m板%d月%d日人次統計圖\n", brd->brdname, old->mon, old->mday);
  else if (key == 2)
    fprintf(fp, "\033[1m%-12s\033[m板%d月%d日使用時間統計圖(單位:\033[1;33m%s\033[m)\n", brd->brdname, old->mon, old->mday, t_deg);
  else if (key == 3)
    fprintf(fp, "\033[1m%-12s\033[m板%d月%d日CP統計圖(單位:\033[1;33m%s\033[m)\n", brd->brdname, old->mon, old->mday, t_deg);

  for (j = 0; j < 20; j++)
  {
    deg = (unit != 1) ? (unit / 2) + unit * (19 - j) : unit + unit * (19 - j);
    fprintf(fp, "\033[1;36m%3d\033[37m┤\033[m", deg);

    for (i = 0; i < old->hour + 1; i++)
    {
      if (hr_data[i] > unit * (19 - j))
      {
        if (((hr_data[i] - unit * (19 - j)) / unit) >= 1)
          fprintf(fp, "\033[1;34m%3s\033[m", block[10]);
        else
        {
          res = ((hr_data[i] - unit * (19 - j)) * 10)/ unit;
          fprintf(fp, "\033[1;34m%3s\033[m", block[res]);
        }
      }
      else if ((hr_data[i] > unit * (18 - j)) && (hr_data[i] <= unit * (19 - j)))
        fprintf(fp, "\033[1;33m%3d\033[m", hr_data[i]);
      else
        fprintf(fp, "   ");
    }

    fprintf(fp, "\n");
  }

  fprintf(fp, "  \033[1;36m0\033[37m└────────────────────────────────────┤\n");
  fprintf(fp, "(Hr)\033[1;32m0  1  2  3  4  5  6  7  8  9  10  11 12 13 14 15 16 17 18 19 20 21 22 23 24\033[m\n");
  fclose(fp);

  /* amaki.030815: 複製一份到rec_board板去 */
  if (now->hour == 0)
  {
    brd_fpath(folder, "rec_board", FN_DIR);
    hdr_stamp(folder, HDR_COPY, &post, fpath);
    strcpy(post.owner, "sysop");

    if (key == 1)
      sprintf(buf, "[%d 月 %d 日] %-12s板人氣統計", old->mon, old->mday, (brd->battr & BRD_NOSTAT) ? "○○○○" : brd->brdname);
    else if (key == 2)
      sprintf(buf, "[%d 月 %d 日] %-12s板使用時間統計", old->mon, old->mday, (brd->battr & BRD_NOSTAT) ? "○○○○" : brd->brdname);
    else if (key == 3)
      sprintf(buf, "[%d 月 %d 日] %-12s板CP統計", old->mon, old->mday, (brd->battr & BRD_NOSTAT) ? "○○○○" : brd->brdname);

    strcpy(post.title, buf);
    if (brd->battr & BRD_NOSTAT)
      post.xmode |= POST_RESTRICT;
    rec_add(folder, &post, sizeof(post));
  }
}


static void
data_draw(data, brd, now, old, bno)
  DATA *data;
  BRD *brd;
  DATE *now, *old;
  int bno;
{
  int i, max = 0;
  char deg[8];

  for (i = 0; i < old->hour + 1; i++)
  {
    hr_data[i] = data->hr_mantime[i];
  }
  hr_draw(brd, now, old, "hr_mantime", bno, NULL, 1);

  /* amaki.030816: 數值太大造成排版錯亂,特別處理 */
  for (i = 0; i < old->hour + 1; i++)
  {
    if (data->hr_time[i] > max)
      max = data->hr_time[i];
  }

  if (max > 999)
  {
    for (i = 0; i < old->hour + 1; i++)
    {
      hr_data[i] = data->hr_time[i] / 60;
    }
    strcpy(deg, "分");
    hr_draw(brd, now, old, "hr_time", bno, deg, 2);
  }
  else
  {
    for (i = 0; i < old->hour + 1; i++)
    {
      hr_data[i] = data->hr_time[i];
    }
    strcpy(deg, "秒");
    hr_draw(brd, now, old, "hr_time", bno, deg, 2);
  }

  max = 0;
  for (i = 0; i < old->hour + 1; i++)
  {
    if (data->hr_cp[i] > max)
      max = data->hr_cp[i];
  }

  if (max > 999)
  {
    for (i = 0; i < old->hour + 1; i++)
    {
      hr_data[i] = data->hr_cp[i] / 60;
    }
    strcpy(deg, "分");
    hr_draw(brd, now, old, "hr_cp", bno, deg, 3);
  }
  else
  {
    for (i = 0; i < old->hour + 1; i++)
    {
      hr_data[i] = data->hr_cp[i];
    }
    strcpy(deg, "秒");
    hr_draw(brd, now, old, "hr_cp", bno, deg, 3);
  }
}


static void
data_feed(brd, now, old, bno)
  BRD *brd;
  DATE *now, *old;
  int bno;
{
  DATA data;
  int fd, i;
  char fpath[80];

  brd_fpath(fpath, brd->brdname, "bdata");
  fd = open(fpath, O_RDWR | O_CREAT, 0600);
  read(fd, &data, sizeof(DATA));

  data.hr_mantime[old->hour] = bshm->hr_mantime[bno];
  data.hr_time[old->hour] = bshm->hr_time[bno];
  data.hr_cp[old->hour] = (data.hr_mantime[old->hour] > 0) ?
    data.hr_time[old->hour] / data.hr_mantime[old->hour] : 0;

  data_draw(&data, brd, now, old, bno);

  bshm->hr_mantime[bno] = bshm->hr_time[bno] = 0;

  if (now->hour == 0)
  {
    for (i = 0; i < 24; i++)
    {
      data.hr_mantime[i] = 0;
      data.hr_time[i] = 0;
      data.hr_cp[i] = 0;
    }
  }

  lseek(fd, (off_t) (sizeof(DATA) * 0), SEEK_SET);
  write(fd, &data, sizeof(DATA));
  close(fd);
}


int
main()
{
  int i;
  BRD *brd;
  DATE now, old;
  time_t time_now;
  struct tm *t;

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

  time(&time_now);
  t = localtime(&time_now);
  now.year = t->tm_year;
  now.yday = t->tm_yday;
  now.mon = t->tm_mon + 1;
  now.mday = t->tm_mday;
  now.hour = t->tm_hour;

  /* amaki.030816: 把時間往回撥到上一個小時,方便使用 */
  time(&time_now);
  time_now -= 400;
  t = localtime(&time_now);
  old.year = t->tm_year;
  old.yday = t->tm_yday;
  old.mon = t->tm_mon + 1;
  old.mday = t->tm_mday;
  old.hour = t->tm_hour;

  for (i = 0; i < bshm->number; i++)
  {
    brd = bshm->bcache + i;
    /* amaki.030730: 開啟看板目錄下的bdata */
    data_feed(brd, &now, &old, i);
  }
  return 0;
}

--
  Origin: luna.twbbs.org
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻