summaryrefslogtreecommitdiffstats
path: root/util/account.c
diff options
context:
space:
mode:
Diffstat (limited to 'util/account.c')
-rw-r--r--util/account.c414
1 files changed, 414 insertions, 0 deletions
diff --git a/util/account.c b/util/account.c
new file mode 100644
index 00000000..e4166092
--- /dev/null
+++ b/util/account.c
@@ -0,0 +1,414 @@
+/* $Id: account.c,v 1.1 2002/03/07 15:13:45 in2 Exp $ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include "config.h"
+#include "pttstruct.h"
+#include "util.h"
+
+#define MAX_LINE 16
+#define ADJUST_M 6 /* adjust back 5 minutes */
+
+extern struct pttcache_t *ptt;
+
+void
+ reset_garbage()
+{
+ if (ptt == NULL)
+ {
+ ptt = attach_shm(PTTSHM_KEY, sizeof(*ptt));
+ if (ptt->touchtime == 0)
+ ptt->touchtime = 1;
+ }
+
+/* 不整個reload?
+ for(n=0;n<=ptt->max_film;n++)
+ printf("\n**%d**\n %s \n",n,ptt->notes[n]);
+ */
+ ptt->uptime = 0;
+ reload_pttcache();
+
+ printf("\n動態看板數[%d]\n", ptt->max_film);
+/*
+ for(n=0; n<MAX_MOVIE_SECTION; n++)
+ printf("sec%d=> 起點:%d 下次要換的:%d\n ",n,ptt->n_notes[n],
+ ptt->next_refresh[n]);
+ printf("\n");
+*/
+}
+
+void
+keeplog(fpath, board, title)
+ char *fpath;
+ char *board;
+ char *title;
+{
+ fileheader_t fhdr;
+ int bid;
+ char genbuf[256], buf[256];
+
+ if (!board)
+ board = "Record";
+
+
+ sprintf(genbuf, "boards/%s", board);
+ stampfile(genbuf, &fhdr);
+ sprintf(buf, "mv %s %s", fpath, genbuf);
+ system(buf);
+/*
+ printf("keep record:[%s][%s][%s][%s]\n",fpath, board, title,genbuf);
+*/
+ strcpy(fhdr.title, title);
+ strcpy(fhdr.owner, "[歷史老師]");
+ sprintf(genbuf, "boards/%s/.DIR", board);
+ append_record(genbuf, &fhdr, sizeof(fhdr));
+ if((bid = getbnum(board)) > 0)touchbtotal(bid);
+
+}
+
+
+static void
+my_outs(fp, buf, mode)
+ FILE *fp;
+ char buf[], mode;
+{
+ static char state = '0';
+
+ if (state != mode)
+ fprintf(fp, "[3%cm", state = mode);
+ if (buf[0])
+ {
+ fprintf(fp, buf);
+ buf[0] = 0;
+ }
+}
+
+
+void gzip(source, target, stamp)
+ char *source, *target, *stamp;
+{
+ char buf[128];
+ sprintf(buf, "gzip -f9n adm/%s%s", target, stamp);
+ rename(source, &buf[14]);
+ system(buf);
+}
+
+extern struct fromcache_t *fcache;
+extern uhash_t *uhash;
+
+int main() {
+ int hour, max, item, total, i, j, mo, da, max_user = 0, max_login = 0,
+ max_reg = 0, mahour = 0, k;
+ char *act_file = ".act";
+ char *log_file = "usies";
+ char buf[256], buf1[256], *p;
+ FILE *fp, *fp1;
+ int act[27]; /* 次數/累計時間/pointer */
+ time_t now;
+ struct tm *ptime;
+
+ now = time(NULL) - ADJUST_M * 60; /* back to ancent */
+ ptime = localtime(&now);
+
+ memset(act, 0, sizeof(act));
+ printf("次數/累計時間\n");
+ if ((ptime->tm_hour != 0) && (fp = fopen(act_file, "r")))
+ {
+ fread(act, sizeof(act), 1, fp);
+ fclose(fp);
+ }
+ if ((fp = fopen(log_file, "r")) == NULL)
+ {
+ printf("cann't open usies\n");
+ return 1;
+ }
+ if (act[26])
+ fseek(fp, act[26], 0);
+ while (fgets(buf, 256, fp))
+ {
+ buf[11+2]=0;
+ hour = atoi(buf + 11);
+ if (hour < 0 || hour > 23)
+ {
+ continue;
+ }
+//"09/06/1999 17:44:58 Mon "
+// 012345678901234567890123
+ if (strstr(buf + 20, "ENTER"))
+ {
+ act[hour]++;
+ continue;
+ }
+ if ((p = (char *) strstr(buf + 40, "Stay:")))
+ {
+ if((hour = atoi(p + 5))) {
+ act[24] += hour;
+ act[25]++;
+ }
+ continue;
+ }
+ }
+ act[26] = ftell(fp);
+ fclose(fp);
+ for (i = max = total = 0; i < 24; i++)
+ {
+ total += act[i];
+ if (act[i] > max)
+ {
+ max_user = max = act[i];
+ mahour = i;
+ }
+ }
+ item = max / MAX_LINE + 1;
+
+ if (!ptime->tm_hour)
+ {
+ keeplog("etc/today", "Record", "上站人次統計");
+ keeplog("etc/money", "Security", "本日金錢往來記錄");
+ keeplog("etc/illegal_money", "Security", "本日違法賺錢記錄");
+ keeplog("etc/chicken", "Record", "雞場報告");
+ }
+
+ printf("上站人次統計\n");
+ if ((fp = fopen("etc/today", "w")) == NULL)
+ {
+ printf("cann't open etc/today\n");
+ return 1;
+ }
+ fprintf(fp, "\t\t\t 每小時上站人次統計 [%02d/%02d/%02d] \n\n", ptime->tm_year % 100, ptime->tm_mon + 1, ptime->tm_mday);
+ for (i = MAX_LINE + 1; i > 0; i--)
+ {
+ strcpy(buf, " ");
+ for (j = 0; j < 24; j++)
+ {
+ max = item * i;
+ hour = act[j];
+ if (hour && (max > hour) && (max - item <= hour))
+ {
+ my_outs(fp, buf, '3');
+ fprintf(fp, "%-3d", hour / 10);
+ }
+ else if (max <= hour)
+ {
+ my_outs(fp, buf, '4');
+ fprintf(fp, "█ ");
+ }
+ else
+ strcat(buf, " ");
+ }
+ fprintf(fp, "\n");
+ }
+ fprintf(fp, " "
+ "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23\n\n"
+ "\t 單位: 10 人");
+ fprintf(fp, " 總共上站人次:%-7d平均使用人數:%d\n", total, total / 24);
+ fclose(fp);
+
+ if((fp = fopen(act_file, "w"))) {
+ fwrite(act, sizeof(act), 1, fp);
+ fclose(fp);
+ }
+
+/* -------------------------------------------------------------- */
+
+ sprintf(buf, "-%02d%02d%02d",
+ ptime->tm_year % 100, ptime->tm_mon + 1, ptime->tm_mday);
+
+ now += ADJUST_M * 60; /* back to future */
+
+
+ printf("歷史事件處理\n");
+/* Ptt 歷史事件處理 */
+ if((fp = fopen("etc/history.data", "r"))) { /*最多同時上線 */
+ if (fscanf(fp, "%d %d %d %d", &max_login, &max, &max_reg, &k))
+ {
+ int a;
+ resolve_fcache();
+ printf("此時段最多同時上線:%d 過去:%d\n", a = fcache->max_user, k);
+ fclose(fp);
+ if (a > k)
+ {
+ ptime = localtime(&fcache->max_time);
+ if((fp1 = fopen("etc/history", "a")))
+ {
+ fprintf(fp1,
+ "◎ 【%02d/%02d/%02d %02d:%02d】"
+ "同時在坊內人數首次達到 %d 人次\n",
+ ptime->tm_mon + 1, ptime->tm_mday, ptime->tm_year % 100,
+ ptime->tm_hour, ptime->tm_min, a);
+ fclose(fp1);
+ }
+ if((fp = fopen("etc/history.data", "w")))
+ {
+ fprintf(fp, "%d %d %d %d", max_login, max, max_reg, a);
+ fclose(fp);
+ }
+ }
+ }
+ else
+ fclose(fp);
+ }
+ ptime = localtime(&now);
+
+ if (ptime->tm_hour)
+ {
+ /* rotate one line in today_is */
+ puts("多個節日處理");
+ if((fp1 = fopen("etc/today_is", "r"))) {
+ char tod[100][20];
+
+ i = 0;
+ while(i < 100 && fgets(tod[i], sizeof(tod[0]), fp1))
+ i++;
+ fclose(fp1);
+
+ fp1 = fopen("etc/today_is", "w");
+ for(j = 0; j < i; j++)
+ fputs(tod[j + 1 < i ? j + 1 : 0], fp1);
+ fclose(fp1);
+ }
+ }
+
+
+ if (!ptime->tm_hour)
+ {
+ keeplog(".note", "Record", "心情留言版");
+ system("/bin/cp etc/today etc/yesterday");
+/* system("rm -f note.dat"); */
+/* Ptt */
+ sprintf(buf1, "[公安報告] 使用者上線監控 [%02d/%02d:%02d]"
+ ,ptime->tm_mon + 1, ptime->tm_mday, ptime->tm_hour);
+ keeplog("usies", "Security", buf1);
+ printf("[公安報告] 使用者上線監控\n");
+ gzip(log_file, "usies", buf);
+ printf("壓縮使用者上線監控\n");
+/* Ptt 歷史事件處理 */
+ now = time(NULL) - ADJUST_M * 60; /* back to ancent */
+ ptime = localtime(&now);
+
+ attach_uhash();
+ if((fp = fopen("etc/history.data", "r")))
+ { /* 單日最多次人次,同時上線,註冊 */
+ if (fscanf(fp, "%d %d %d %d", &max_login, &max, &max_reg, &k))
+ {
+ fp1 = fopen("etc/history", "r+");
+ fseek(fp1, 0, 2);
+ if (max_user > max)
+ {
+ fprintf(fp1, "◇ 【%02d/%02d/%02d %02d】 "
+ "單一小時上線人次首次達到 %d 人次 \n"
+ ,ptime->tm_mon + 1, ptime->tm_mday, ptime->tm_year % 100, mahour, max_user);
+ max = max_user;
+ }
+ if (total > max_login)
+ {
+ fprintf(fp1, "◆ 【%02d/%02d/%02d】 "
+ "單日上線人次首次達到 %d 人次 \n"
+ ,ptime->tm_mon + 1, ptime->tm_mday, ptime->tm_year % 100, total);
+ max_login = total;
+ }
+
+ if (uhash->number > max_reg + max_reg / 10)
+ {
+ fprintf(fp1, "★ 【%02d/%02d/%02d】 "
+ "總註冊人數提升到 %d 人 \n"
+ ,ptime->tm_mon + 1, ptime->tm_mday, ptime->tm_year % 100, uhash->number);
+ max_reg = uhash->number;
+ }
+
+ fclose(fp1);
+ }
+ fclose(fp);
+ fp = fopen("etc/history.data", "w");
+ fprintf(fp, "%d %d %d %d", max_login, max, max_reg, k);
+ fclose(fp);
+ }
+ now += ADJUST_M * 60; /* back to future */
+ ptime = localtime(&now);
+
+ /* Ptt 節日處理 */
+ printf("節日處理\n");
+ if((fp1 = fopen("etc/today_is", "w"))) {
+ i = 0;
+ if((fp = fopen("etc/feast", "r"))) {
+ while(fgets(buf1, sizeof(buf1), fp)) {
+ if(buf[0] != '#' &&
+ sscanf(buf1, "%d %d ", &mo, &da) == 2) {
+ if(ptime->tm_mday == da && ptime->tm_mon + 1 == mo) {
+ i = 1;
+ fprintf(fp1, "%-14.14s", &buf1[6]);
+ }
+ }
+ }
+ fclose(fp);
+ }
+ printf("節日處理1\n");
+ if(i == 0) {
+ if((fp = fopen("etc/today_boring", "r"))) {
+ while(fgets(buf1, sizeof(buf1), fp))
+ if(strlen(buf) > 3)
+ fprintf(fp1, "%s", buf1);
+ fclose(fp);
+ } else
+ fprintf(fp1, "本日節日徵求中");
+ }
+ fclose(fp1);
+ }
+
+ /* Ptt 歡迎畫面處理 */
+ printf("歡迎畫面處理\n");
+
+ if((fp = fopen("etc/Welcome.date", "r")))
+ {
+ char temp[50];
+ while (fscanf(fp, "%d %d %s\n", &mo, &da, buf1) != EOF)
+ {
+ if (ptime->tm_mday == da && ptime->tm_mon + 1 == mo)
+ {
+ strcpy(temp, buf1);
+ sprintf(buf1, "cp -f etc/Welcomes/%s etc/Welcome", temp);
+ system(buf1);
+ break;
+ }
+ }
+ fclose(fp);
+ }
+ printf("歡迎畫面處理\n");
+ if (ptime->tm_wday == 0)
+ {
+ keeplog("etc/week", "Record", "本週熱門話題");
+
+ gzip("bbslog", "bntplink", buf);
+ gzip("innd/bbslog", "innbbsd", buf);
+ gzip("etc/mailog", "mailog", buf);
+ }
+
+ if (ptime->tm_mday == 1)
+ keeplog("etc/month", "Record", "本月熱門話題");
+
+ if (ptime->tm_yday == 1)
+ keeplog("etc/year", "Record", "年度熱門話題");
+ }
+ else if (ptime->tm_hour == 3 && ptime->tm_wday == 6)
+ {
+ char *fn1 = "tmp";
+ char *fn2 = "suicide";
+ rename(fn1, fn2);
+ mkdir(fn1, 0755);
+ sprintf(buf, "tar cfz adm/%s-%02d%02d%02d.tgz %s",
+ fn2, ptime->tm_year % 100, ptime->tm_mon + 1, ptime->tm_mday, fn2);
+ system(buf);
+ sprintf(buf, "/bin/rm -fr %s", fn2);
+ system(buf);
+ }
+/* Ptt reset Ptt's share memory */
+ printf("重設Pttcache 與fcache\n");
+
+ fcache->uptime = 0;
+ resolve_fcache();
+ reset_garbage();
+ return 0;
+}