回精華區
作者BioStar.bbs@micro.bio.ncue.edu.tw (澎湖小雲雀(Skyl 看板: plan
標題[文件] 雙人隊奕戰績統計
時間擎天崗 (2004/01/11 Sun 01:22:09) Updated: 2005/06/11
: src/util/Makefile

EXE =   ... topbwboard

: 新增 util/topbwboard.c

/*-------------------------------------------------------*/
/* util/topboard.c      ( NTHU CS MapleBBS Ver 3.00 )    */
/*-------------------------------------------------------*/
/* target : 使用者資料統計及排名                         */
/* create : 99/03/29                                     */
/* update : 01/10/01                                     */
/* modify : itoc.bbs@bbs.tnfsh.tn.edu.tw                 */
/*-------------------------------------------------------*/


#include "bbs.h"


#define OUTFILE_BW_A_W  BBSHOME"/gem/@/@-bwaw"
#define OUTFILE_BW_A_L  BBSHOME"/gem/@/@-bwal"
#define OUTFILE_BW_B_W  BBSHOME"/gem/@/@-bwbw"
#define OUTFILE_BW_B_L  BBSHOME"/gem/@/@-bwbl"
#define OUTFILE_BW_C_W  BBSHOME"/gem/@/@-bwcw"
#define OUTFILE_BW_C_L  BBSHOME"/gem/@/@-bwcl"
#define OUTFILE_BW_D_W  BBSHOME"/gem/@/@-bwdw"
#define OUTFILE_BW_D_L  BBSHOME"/gem/@/@-bwdl"
#define OUTFILE_BW_E_W  BBSHOME"/gem/@/@-bwew"
#define OUTFILE_BW_E_L  BBSHOME"/gem/@/@-bwel"


#define TOPNUM          36
#define TOPNUM_HALF     (TOPNUM / 2)


typedef struct
{
  char userid[IDLEN + 1];
  char username[UNLEN + 1];
  int num;
}       DATA;


typedef struct
{
  int al;
  int aw;
  int bl;
  int bw;
  int cl;
  int cw;
  int dl;
  int dw;
  int el;
  int ew;
}       BWBOARD;


static DATA topbwaw[TOPNUM], topbwal[TOPNUM], topbwbw[TOPNUM],
            topbwbl[TOPNUM], topbwcw[TOPNUM], topbwcl[TOPNUM],
            topbwdw[TOPNUM], topbwdl[TOPNUM], topbwew[TOPNUM],
            topbwel[TOPNUM];


static int
sort_compare(p1, p2)
  const void *p1;
  const void *p2;
{
  int k;
  DATA *a1, *a2;

  a1 = (DATA *) p1;
  a2 = (DATA *) p2;

  k = a2->num - a1->num;
  return k ? k : str_cmp(a1->userid, a2->userid);
}


static void
fill_username(src)
  DATA *src;
{
  int i, fd;
  char fpath[64];
  ACCT acct;
  DATA *p;

  for (i = 0; i < TOPNUM; i++)
  {
    p = src + i;
    if (!strlen(p->userid))
      continue;
    usr_fpath(fpath, p->userid, FN_ACCT);
    if ((fd = open(fpath, O_RDONLY)) < 0)
      continue;
    read(fd, &acct, sizeof(ACCT));
    close(fd);
    str_ncpy(p->userid, acct->userid, sizeof(p->userid));
    str_ncpy(p->username, acct->username, sizeof(p->username));
  }
}


static DATA *
findmin(src)
  DATA *src;
{
  int i;
  DATA *p;

  p = src;
  for (i = 0; i < TOPNUM; i++)
    if (src[i].num < p->num)
      p = src + i;
  return (p);
}


static void
merge_id_nick(dst, userid, nick)
  char *dst;
  char *userid;
  char *nick;
{
  if (*userid)
  {
    sprintf(dst, "%s (%s)", userid, nick);

    if (strlen(dst) > 25)
      dst[25] = 0;
  }
  else
    dst[0] = 0;
}


static void
write_data(fpath, title, data, wl)
  char *fpath;
  char *title;
  DATA *data;
  char wl;
{
  FILE *fp;
  char buf[256];
  int i, num1, num2;

  if (!(fp = fopen(fpath, "w")))
    return;

  i = 12 - (strlen(title) >> 1);
  sprintf(buf, " \033[1;33m○ ──────────→ "
    "\033[41m%%%ds%%s%%%ds\033[40m ←────────── ○\033[m\n\n",
    i, i);
  fprintf(fp, buf, "", title, "");

  fprintf(fp,
    "\033[1;37m名次  \033[33m代號(暱稱)                \033[36m%s\033[m   "
    "\033[1;37m名次  \033[33m代號(暱稱)                \033[36m%s\033[m\n"
    "\033[1;32m%s\033[m\n",
    wl ? "勝場" : "敗場", wl ? "勝場" : "敗場", MSG_SEPERATOR);

  for (i = 0; i < TOPNUM_HALF; i++)
  {
    char buf1[80], buf2[80];

    merge_id_nick(buf1, data[i].userid, data[i].username);
    merge_id_nick(buf2, data[i + TOPNUM_HALF].userid,
      data[i + TOPNUM_HALF].username);

    /* itoc.010408: 解決錢太多,畫面爆掉的問題 */
    num1 = data[i].num / 1000000;
    num2 = data[i + TOPNUM_HALF].num / 1000000;
    if (num2)                   /* 那麼 data[i].num 也必定 > 10^6 */
    {
      fprintf(fp, "[%2d] %-25s %5dM  [%2d] %-25s %5dM\n", i + 1, buf1, num1,
        i + 1 + TOPNUM_HALF, buf2, num2);
    }
    else if (num1)
    {
      fprintf(fp, "[%2d] %-25s %5dM  [%2d] %-25s %6d\n", i + 1, buf1, num1,
        i + 1 + TOPNUM_HALF, buf2, data[i + TOPNUM_HALF].num);
    }
    else
    {
      fprintf(fp, "[%2d] %-25s %6d  [%2d] %-25s %6d\n", i + 1, buf1,
        data[i].num, i + 1 + TOPNUM_HALF, buf2, data[i + TOPNUM_HALF].num);
    }
  }

  fprintf(fp, "\n");
  fclose(fp);
}


static inline void
topusr(userid, bwboard)
  char *userid;
  BWBOARD *bwboard;
{
  DATA *p;

  if ((p = findmin(&topbwaw))->num < bwboard->aw)
  {
    str_ncpy(p->userid, userid, sizeof(p->userid));
    p->num = bwboard->aw;
  }

  if ((p = findmin(&topbwal))->num < bwboard->al)
  {
    str_ncpy(p->userid, userid, sizeof(p->userid));
    p->num = bwboard->al;
  }

  if ((p = findmin(&topbwbw))->num < bwboard->bw)
  {
    str_ncpy(p->userid, userid, sizeof(p->userid));
    p->num = bwboard->bw;
  }

  if ((p = findmin(&topbwbl))->num < bwboard->bl)
  {
    str_ncpy(p->userid, userid, sizeof(p->userid));
    p->num = bwboard->bl;
  }

  if ((p = findmin(&topbwcw))->num < bwboard->cw)
  {
    str_ncpy(p->userid, userid, sizeof(p->userid));
    p->num = bwboard->cw;
  }

  if ((p = findmin(&topbwcl))->num < bwboard->cl)
  {
    str_ncpy(p->userid, userid, sizeof(p->userid));
    p->num = bwboard->cl;
  }

  if ((p = findmin(&topbwdw))->num < bwboard->dw)
  {
    str_ncpy(p->userid, userid, sizeof(p->userid));
    p->num = bwboard->dw;
  }

  if ((p = findmin(&topbwdl))->num < bwboard->dl)
  {
    str_ncpy(p->userid, userid, sizeof(p->userid));
    p->num = bwboard->dl;
  }

  if ((p = findmin(&topbwew))->num < bwboard->ew)
  {
    str_ncpy(p->userid, userid, sizeof(p->userid));
    p->num = bwboard->ew;
  }

  if ((p = findmin(&topbwel))->num < bwboard->el)
  {
    str_ncpy(p->userid, userid, sizeof(p->userid));
    p->num = bwboard->el;
  }
}



/*-------------------------------------------------------*/
/* 主程式                                                */
/*-------------------------------------------------------*/


int
main()
{
  char c;

  memset(&topbwaw, 0, sizeof(topbwaw));
  memset(&topbwal, 0, sizeof(topbwal));
  memset(&topbwbw, 0, sizeof(topbwbw));
  memset(&topbwbl, 0, sizeof(topbwbl));
  memset(&topbwcw, 0, sizeof(topbwcw));
  memset(&topbwcl, 0, sizeof(topbwcl));
  memset(&topbwdw, 0, sizeof(topbwdw));
  memset(&topbwdl, 0, sizeof(topbwdl));
  memset(&topbwew, 0, sizeof(topbwew));
  memset(&topbwel, 0, sizeof(topbwel));

  for (c = 'a'; c <= 'z'; c++)
  {
    char buf[64];
    struct dirent *de;
    DIR *dirp;

    sprintf(buf, BBSHOME "/usr/%c", c);
    chdir(buf);

    if (!(dirp = opendir(".")))
      continue;

    while (de = readdir(dirp))
    {
      BWBOARD bwboard;
      int fd;
      char *fname;

      fname = de->d_name;
      if (*fname <= ' ' || *fname == '.')
        continue;

      sprintf(buf, "%s/bwboard", fname);
      if ((fd = open(buf, O_RDONLY)) < 0)
        continue;

      read(fd, &bwboard, sizeof(BWBOARD));
      close(fd);

      bwboard.al -= bwboard.aw;
      bwboard.bl -= bwboard.bw;
      bwboard.cl -= bwboard.cw;
      bwboard.dl -= bwboard.dw;
      bwboard.el -= bwboard.ew;

      topusr(fname, &bwboard);
    }

    closedir(dirp);
  }

  chdir(BBSHOME);
  fill_username(&topbwaw);
  fill_username(&topbwal);
  fill_username(&topbwbw);
  fill_username(&topbwbl);
  fill_username(&topbwcw);
  fill_username(&topbwcl);
  fill_username(&topbwdw);
  fill_username(&topbwdl);
  fill_username(&topbwew);
  fill_username(&topbwel);

  qsort(topbwaw, TOPNUM, sizeof(DATA), sort_compare);
  write_data(OUTFILE_BW_A_W, "黑白棋勝場英雄榜", &topbwaw, 1);

  qsort(topbwal, TOPNUM, sizeof(DATA), sort_compare);
  write_data(OUTFILE_BW_A_L, "黑白棋敗場狗熊榜", &topbwal, 0);

  qsort(topbwbw, TOPNUM, sizeof(DATA), sort_compare);
  write_data(OUTFILE_BW_B_W, "五子棋勝場英雄榜", &topbwbw, 1);

  qsort(topbwbl, TOPNUM, sizeof(DATA), sort_compare);
  write_data(OUTFILE_BW_B_L, "五子棋敗場狗熊榜", &topbwbl, 0);

  qsort(topbwcw, TOPNUM, sizeof(DATA), sort_compare);
  write_data(OUTFILE_BW_C_W, "圍棋勝場英雄榜", &topbwcw, 1);

  qsort(topbwcl, TOPNUM, sizeof(DATA), sort_compare);
  write_data(OUTFILE_BW_C_L, "圍棋敗場狗熊榜", &topbwcl, 0);

  qsort(topbwdw, TOPNUM, sizeof(DATA), sort_compare);
  write_data(OUTFILE_BW_D_W, "軍棋勝場英雄榜", &topbwdw, 1);

  qsort(topbwdl, TOPNUM, sizeof(DATA), sort_compare);
  write_data(OUTFILE_BW_D_L, "軍棋敗場狗熊榜", &topbwdl, 0);

  qsort(topbwew, TOPNUM, sizeof(DATA), sort_compare);
  write_data(OUTFILE_BW_E_W, "暗棋勝場英雄榜", &topbwew, 1);

  qsort(topbwel, TOPNUM, sizeof(DATA), sort_compare);
  write_data(OUTFILE_BW_E_L, "暗棋敗場狗熊榜", &topbwel, 0);

  return 0;
}


然後在系統精華區中加入 @-bwaw 、 @-bwal 、 @-bwbw 、 @-bwbl 、 @-bwcw 、
@-bwcl 、 @-bwdw 、 @-bwdl 、 @-bwew 、 @-bwel 作為資料!


--
  Origin:  彰化師大生物系˙吟風‧眺月‧擎天崗  micro.bio.ncue.edu.tw 
  Author: BioStar xman.bio.ncue.edu.tw 發表
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻