diff options
-rw-r--r-- | pttbbs/daemon/angelbeats/abc.c | 2 | ||||
-rw-r--r-- | pttbbs/daemon/angelbeats/angelbeats.c | 42 | ||||
-rw-r--r-- | pttbbs/include/daemons.h | 9 | ||||
-rw-r--r-- | pttbbs/mbbsd/angel.c | 48 | ||||
-rw-r--r-- | pttbbs/mbbsd/menu.c | 4 |
5 files changed, 58 insertions, 47 deletions
diff --git a/pttbbs/daemon/angelbeats/abc.c b/pttbbs/daemon/angelbeats/abc.c index ed9a7bb3..a17b4849 100644 --- a/pttbbs/daemon/angelbeats/abc.c +++ b/pttbbs/daemon/angelbeats/abc.c @@ -57,6 +57,8 @@ int main(int argc, char *argv[]) } } else if (strcmp(argv[1], "list") == 0) { req.operation = ANGELBEATS_REQ_GET_ONLINE_LIST; + } else if (strcmp(argv[1], "save") == 0) { + req.operation = ANGELBEATS_REQ_SAVE_STATE; } else if (strcmp(argv[1], "perf") == 0) { req.operation = ANGELBEATS_REQ_EXPORT_PERF; } else { diff --git a/pttbbs/daemon/angelbeats/angelbeats.c b/pttbbs/daemon/angelbeats/angelbeats.c index 4cf7c657..2c2c0b0e 100644 --- a/pttbbs/daemon/angelbeats/angelbeats.c +++ b/pttbbs/daemon/angelbeats/angelbeats.c @@ -78,7 +78,7 @@ static int debug = 0; #ifndef ANGEL_STATE_FILE #define ANGEL_STATE_FILE BBSHOME "/log/angel_state.txt" #endif -#define ANGEL_STATE_VERSION (1) +#define ANGEL_STATE_VERSION (2) ////////////////////////////////////////////////////////////////////////////// // AngelInfo list operation @@ -114,6 +114,7 @@ typedef struct { PerfData perf; time_t last_activity; // last known activity from master time_t last_assigned; // last time being assigned with new master + int last_assigned_master; // uid of last new master int uid; int masters; // counter of who have this one as angel char userid[IDLEN+1]; @@ -347,13 +348,14 @@ suggest_online_angel(int master_uid) { } int -inc_angel_master(int uid) { +inc_angel_master(int uid, int master_uid) { AngelInfo *kanade = angel_list_find_by_uid(uid); time_t now = time(0); if (!kanade) return 0; kanade->masters++; kanade->last_assigned = now; + kanade->last_assigned_master = master_uid; return 1; } @@ -501,6 +503,8 @@ create_angel_report(int myuid, angel_beats_report *prpt) { // report my information if (myuid > 0 && (kanade = angel_list_find_by_uid(myuid))) { prpt->my_active_masters = kanade->masters; + prpt->last_assigned = kanade->last_assigned; + prpt->last_assigned_master = kanade->last_assigned_master; } return 0; } @@ -536,7 +540,7 @@ void print_dash(FILE *fp, int len, const char *prefix) { void load_state_data() { int version = -1, i = 0; - int activity, assigned; + int activity, assigned, assigned_master; char uid[256]; PerfData d; AngelInfo *kanade; @@ -545,21 +549,35 @@ void load_state_data() { return; if (fscanf(fp, "%d\n", &version) != 1 || - version != ANGEL_STATE_VERSION) { + (version != 1 && version != ANGEL_STATE_VERSION)) { error("Invalid state file (version=%d)\n", version); fclose(fp); return; } fscanf(fp, "%d %d\n", &g_perf.start, &g_perf.samples); - while (fscanf(fp, "%s %d %d %d %d %d\n", - uid, &activity, &assigned, - &d.samples, &d.pause1, &d.pause2) == 6) { + if (version == 1) { + while (fscanf(fp, "%s %d %d %d %d %d\n", + uid, &activity, &assigned, + &d.samples, &d.pause1, &d.pause2) == 6) { + i++; + kanade = angel_list_find_by_userid(uid); + if (!kanade) + continue; + kanade->last_activity = activity; + kanade->last_assigned = assigned; + kanade->last_assigned_master = 0; + memcpy(&kanade->perf, &d, sizeof(d)); + } + } else while (fscanf(fp, "%s %d %d %d %d %d %d\n", + uid, &activity, &assigned, &assigned_master, + &d.samples, &d.pause1, &d.pause2) == 7) { i++; kanade = angel_list_find_by_userid(uid); if (!kanade) continue; kanade->last_activity = activity; kanade->last_assigned = assigned; + kanade->last_assigned_master = assigned_master; memcpy(&kanade->perf, &d, sizeof(d)); } log("%s: got %d records.\n", __func__, i); @@ -577,9 +595,10 @@ void save_state_data() { fprintf(fp, "%d\n%d %d\n", ANGEL_STATE_VERSION, g_perf.start, g_perf.samples); for (i = 0; i < g_angel_list_size; i++, kanade++) { - fprintf(fp, "%s %d %d %d %d %d\n", + fprintf(fp, "%s %d %d %d %d %d %d\n", kanade->userid, (int)kanade->last_activity, (int)kanade->last_assigned, + kanade->last_assigned_master, kanade->perf.samples, kanade->perf.pause1, kanade->perf.pause2); } fclose(fp); @@ -666,12 +685,17 @@ client_cb(int fd, short event, void *arg) { log("%s reload\n", Cdatelite(&clk)); init_angel_list(); break; + case ANGELBEATS_REQ_SAVE_STATE: + log("%s save\n", Cdatelite(&clk)); + save_state_data(); + break; + case ANGELBEATS_REQ_SUGGEST_AND_LINK: log("%s master [%s] request suggest&link, ", Cdatelite(&clk), master_uid); data.angel_uid = suggest_online_angel(data.master_uid); if (data.angel_uid > 0) { - inc_angel_master(data.angel_uid); + inc_angel_master(data.angel_uid, data.master_uid); uid = getuserid(data.angel_uid); strlcpy(angel_uid, uid, sizeof(angel_uid)); angel_list_sort(); diff --git a/pttbbs/include/daemons.h b/pttbbs/include/daemons.h index 03714801..634a3ff4 100644 --- a/pttbbs/include/daemons.h +++ b/pttbbs/include/daemons.h @@ -76,6 +76,7 @@ enum ANGELBEATS_OPERATIONS { ANGELBEATS_REQ_EXPORT_PERF, ANGELBEATS_REQ_REG_NEW, ANGELBEATS_REQ_BLAME, + ANGELBEATS_REQ_SAVE_STATE, }; typedef struct { @@ -91,13 +92,21 @@ typedef struct { short total_angels; short total_online_angels; short total_active_angels; + short min_masters_of_online_angels; short max_masters_of_online_angels; short min_masters_of_active_angels; short max_masters_of_active_angels; + short my_index; short my_active_index; short my_active_masters; + short reserved; + + time4_t last_assigned; + time4_t reserved2; + int last_assigned_master; + } angel_beats_report ; #define ANGELBEATS_UID_LIST_SIZE (20) diff --git a/pttbbs/mbbsd/angel.c b/pttbbs/mbbsd/angel.c index ed1732a5..529e9d81 100644 --- a/pttbbs/mbbsd/angel.c +++ b/pttbbs/mbbsd/angel.c @@ -21,10 +21,12 @@ static const char *PROMPT_ANGELBEATS = " Angel Beats! 天使公會 ", -*ERR_CONNECTION = "抱歉,無法連線至天使公會。\n" - "請至 " BN_BUGREPORT " 看板通知站方管理人員。\n", -*ERR_PROTOCOL = "抱歉,天使公會連線異常。\n" - "請至 " BN_BUGREPORT " 看板通知站方管理人員。\n"; +*ERR_CONNECTION = "抱歉,無法連線至天使公會,請稍後再試。\n" + "若持續發生請至 " BN_BUGREPORT " 看板通知站方管理人員。\n", +*ERR_PROTOCOL = "抱歉,天使公會連線異常,請稍後再試。\n" + "若持續發生請至 " BN_BUGREPORT " 看板通知站方管理人員。\n", +*ERR_PROTOCOL2 = "抱歉,天使公會似乎已更新,請重新登入。\n" + "若登入後仍錯誤請至 " BN_BUGREPORT " 看板通知站方管理人員。\n"; ///////////////////////////////////////////////////////////////////////////// // Angel Beats! Client @@ -449,9 +451,10 @@ int a_angelreport() { req.angel_uid = usernum; if (towrite(fd, &req, sizeof(req)) < 0 || - toread(fd, &rpt, sizeof(rpt)) < 0 || - rpt.cb != sizeof(rpt)) { + toread(fd, &rpt, sizeof(rpt)) < 0) { outs(ERR_PROTOCOL); + } else if (rpt.cb != sizeof(rpt)) { + outs(ERR_PROTOCOL2); } else { prints( "\t 現在時間: %s\n\n" @@ -484,40 +487,17 @@ int a_angelreport() { } #endif prints("\n\t 您目前大約有 %d 位活躍小主人。\n", rpt.my_active_masters); + if (rpt.last_assigned_master > 0) { + prints("\n\t 最後收到的新小主人是 %s (%s)\n", + getuserid(rpt.last_assigned_master), + Cdatelite(&rpt.last_assigned)); + } } close(fd); pressanykey(); return 0; } -int a_angelreload() { - vs_hdr2(" Angel Beats! 天使公會 ", " 重整天使資訊 "); - outs("\n" - "\t 由於重新統計天使小主人數目非常花時間,所以目前系統\n" - "\t 一般只會更新已知的天使。 若站方有新增或刪除天使時\n" - "\t 請在改完所有天使權限後利用此功\能來重整天使資訊。\n" - "\n" - "\t 另外由於重整時所有跟天使有關的功\能都會暫停 30 秒 ~ 一兩分鐘,\n" - "\t 請不要沒事就重整,而是真的有調整天使名單後才使用。\n"); - if (vans("請問確定要重整天使資訊了嗎? [y/N]: ") != 'y') { - vmsg("放棄。"); - return 0; - } - - move(1, 0); clrtobot(); - outs("\n連線中...\n"); refresh(); - - if (angel_beats_do_request(ANGELBEATS_REQ_RELOAD, usernum, 0) < 0) { - outs("抱歉,無法連線至天使公會。\n" - "請至 " BN_BUGREPORT " 看板通知站方管理人員。\n"); - } else { - outs("\n完成!\n"); - } - - pressanykey(); - return 0; -} - inline int angel_reject_me(userinfo_t * uin){ int* iter = uin->reject; diff --git a/pttbbs/mbbsd/menu.c b/pttbbs/mbbsd/menu.c index 5b5f664f..5119d7a1 100644 --- a/pttbbs/mbbsd/menu.c +++ b/pttbbs/mbbsd/menu.c @@ -683,10 +683,6 @@ static const commands_t angelmenu[] = { {a_angelmsg, PERM_ANGEL,"Leave message 留言給小主人"}, {a_angelmsg2,PERM_ANGEL,"Call screen 呼叫畫面個性留言"}, {a_angelreport, 0, "Report 線上天使狀態報告"}, -#ifdef ANGEL_ALLOW_MENU_RELOAD - // This will corrupt perf data; let's do that weekly. - {a_angelreload, PERM_SYSOP,"OReload 重整天使資訊"}, -#endif {NULL, 0, NULL} }; |