作者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