diff options
author | piaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2013-03-22 22:04:24 +0800 |
---|---|---|
committer | piaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2013-03-22 22:04:24 +0800 |
commit | 7b2b7df82f51e2bb8fe88107c412824023b7dbcb (patch) | |
tree | a431567496e3825988921c4bc7be963caa1034dd | |
parent | c741f36c7c69f901098f3cf641c3716928fd8fbe (diff) | |
download | pttbbs-7b2b7df82f51e2bb8fe88107c412824023b7dbcb.tar pttbbs-7b2b7df82f51e2bb8fe88107c412824023b7dbcb.tar.gz pttbbs-7b2b7df82f51e2bb8fe88107c412824023b7dbcb.tar.bz2 pttbbs-7b2b7df82f51e2bb8fe88107c412824023b7dbcb.tar.lz pttbbs-7b2b7df82f51e2bb8fe88107c412824023b7dbcb.tar.xz pttbbs-7b2b7df82f51e2bb8fe88107c412824023b7dbcb.tar.zst pttbbs-7b2b7df82f51e2bb8fe88107c412824023b7dbcb.zip |
Angel misc update. Add UI to check master status.
git-svn-id: http://opensvn.csie.org/pttbbs/trunk@5818 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
-rw-r--r-- | pttbbs/daemon/angelbeats/angelbeats.c | 55 | ||||
-rw-r--r-- | pttbbs/include/daemons.h | 8 | ||||
-rw-r--r-- | pttbbs/include/proto.h | 1 | ||||
-rw-r--r-- | pttbbs/mbbsd/angel.c | 48 | ||||
-rw-r--r-- | pttbbs/mbbsd/menu.c | 5 |
5 files changed, 84 insertions, 33 deletions
diff --git a/pttbbs/daemon/angelbeats/angelbeats.c b/pttbbs/daemon/angelbeats/angelbeats.c index 1de7c70d..be679eb6 100644 --- a/pttbbs/daemon/angelbeats/angelbeats.c +++ b/pttbbs/daemon/angelbeats/angelbeats.c @@ -431,6 +431,10 @@ init_angel_list_callback(void *ctx GCC_UNUSED, int uidx, userec_t *u) { // found an angel? if (kanade) { kanade->masters++; + if (u->timesetangel > kanade->last_assigned) { + kanade->last_assigned = u->timesetangel; + kanade->last_assigned_master = unum; + } } return 1; } @@ -448,12 +452,16 @@ create_angel_report(int myuid, angel_beats_report *prpt) { size_t i; AngelInfo *kanade = g_angel_list; int from_cmd = (!myuid); +#if 0 + time4_t now = time4(0); +#endif prpt->min_masters_of_active_angels = SHRT_MAX; prpt->min_masters_of_online_angels = SHRT_MAX; prpt->total_angels = g_angel_list_size; prpt->my_index = 0; prpt->my_active_index = 0; + prpt->inactive_days = ANGELBEATS_INACTIVE_TIME / DAY_SECONDS; for (i = 0; i < g_angel_list_size; i++, kanade++) { int is_pause, logins; @@ -463,11 +471,14 @@ create_angel_report(int myuid, angel_beats_report *prpt) { if (from_cmd) { log(" - %03zu. %-14s: ", i+1, kanade->userid); log("{samples=%d, pause1=%d, pause2=%d} " - "(masters=%d, logins=%d, activity=%d, assigned=%d)", + "(masters=%d, logins=%d, activity=%d, assigned=%d/%s)", kanade->perf.samples, kanade->perf.pause1, kanade->perf.pause2, kanade->masters, logins, (int)kanade->last_activity, - (int)kanade->last_assigned); + (int)kanade->last_assigned, + kanade->last_assigned_master > 0 ? + getuserid(kanade->last_assigned_master) : + "(unknown)"); if (is_pause) log(" [PAUSE %d]", is_pause); log("\n"); @@ -489,6 +500,12 @@ create_angel_report(int myuid, angel_beats_report *prpt) { prpt->max_masters_of_active_angels = kanade->masters; if (prpt->min_masters_of_active_angels > kanade->masters) prpt->min_masters_of_active_angels = kanade->masters; +#if 0 + if (prpt->max_inactive_time > (now - kanade->last_activity)) + prpt->max_inactive_time = (now - kanade->last_activity); + if (prpt->max_unassigned_time > (now - kanade->last_assigned)) + prpt->max_unassigned_time = (now - kanade->last_assigned); +#endif } if (prpt->max_masters_of_online_angels < kanade->masters) prpt->max_masters_of_online_angels = kanade->masters; @@ -549,26 +566,13 @@ void load_state_data() { return; if (fscanf(fp, "%d\n", &version) != 1 || - (version != 1 && version != ANGEL_STATE_VERSION)) { + (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); - 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", + while (fscanf(fp, "%s %d %d %d %d %d %d\n", uid, &activity, &assigned, &assigned_master, &d.samples, &d.pause1, &d.pause2) == 7) { i++; @@ -576,8 +580,12 @@ void load_state_data() { if (!kanade) continue; kanade->last_activity = activity; - kanade->last_assigned = assigned; - kanade->last_assigned_master = assigned_master; + if (assigned > kanade->last_assigned) { + log("warn: angel state data inconsistent with passwd: %s\n", + kanade->userid); + kanade->last_assigned = assigned; + kanade->last_assigned_master = assigned_master; + } memcpy(&kanade->perf, &d, sizeof(d)); } log("%s: got %d records.\n", __func__, i); @@ -750,18 +758,19 @@ client_cb(int fd, short event, void *arg) { goto end; } break; + // TODO remove report1. case ANGELBEATS_REQ_REPORT1: log("%s angel [%s] request for report v1\n", Cdatelite(&clk), master_uid); { angel_beats_report rpt = {0}; - angel_beats_report_v1 v1 = {0}; + assert(sizeof(angel_beats_report_v1) < + sizeof(angel_beats_report)); rpt.cb = sizeof(rpt); create_angel_report(data.angel_uid, &rpt); - memcpy(&v1, &rpt, sizeof(v1)); - v1.cb = sizeof(v1); + rpt.cb = sizeof(angel_beats_report_v1); // write different kind of data! - write(fd, &v1, sizeof(v1)); + write(fd, &rpt, rpt.cb); goto end; } break; diff --git a/pttbbs/include/daemons.h b/pttbbs/include/daemons.h index 8270beaa..6ad6299c 100644 --- a/pttbbs/include/daemons.h +++ b/pttbbs/include/daemons.h @@ -116,11 +116,15 @@ typedef struct { short my_index; short my_active_index; short my_active_masters; - short reserved; + short inactive_days; time4_t last_assigned; - time4_t reserved2; + time4_t reserved; int last_assigned_master; +#if 0 + time4_t max_inactive_time; + time4_t max_unassigned_time; +#endif } angel_beats_report ; diff --git a/pttbbs/include/proto.h b/pttbbs/include/proto.h index b9f69b3e..630185f1 100644 --- a/pttbbs/include/proto.h +++ b/pttbbs/include/proto.h @@ -31,6 +31,7 @@ void merge_dir(const char *dir1, const char *dir2, int isoutter); /* angel */ int a_changeangel(void); +int angel_check_master(void); int a_angelmsg(void); int a_angelmsg2(void); int a_angelreport(void); diff --git a/pttbbs/mbbsd/angel.c b/pttbbs/mbbsd/angel.c index 529e9d81..6197e4cc 100644 --- a/pttbbs/mbbsd/angel.c +++ b/pttbbs/mbbsd/angel.c @@ -345,9 +345,9 @@ do_changeangel(int force) { is_bad_master = dashf(bad_master_file); } -#ifdef ANGEL_CHANGE_TIMELIMIT_MINS if (!(force || HasUserPerm(PERM_ADMIN))) { +#ifdef ANGEL_CHANGE_TIMELIMIT_MINS int duration = ANGEL_CHANGE_TIMELIMIT_MINS; if (is_bad_master) duration *= 3; @@ -356,11 +356,11 @@ do_changeangel(int force) { vmsgf("–Ω传ぱㄏ程ぶ丁筳 %d だ牧", duration); return 0; } - } #endif - - if (is_bad_master && !verify_captcha("磷秖獶タ盽传ぱㄏ\n")) - return 0; + if (is_bad_master && + !verify_captcha("磷秖獶タ盽传ぱㄏ\n")) + return 0; + } getdata(b_lines - 1, 0, "絋﹚璶传ぱㄏ [y/N]", buf, 3, LCECHO); if (buf[0] == 'y') { @@ -412,6 +412,39 @@ angel_order_song(char *receiver, size_t sz_receiver) { return angel_nick; } +int angel_check_master(void) { + char uid[IDLEN + 1]; + userec_t xuser; + int is_my_master; + + vs_hdr2(PROMPT_ANGELBEATS, " 琩高篈 "); + usercomplete("稱琩高 ID: ", uid); + move(2, 0); clrtobot(); + if (!uid) + return 0; + if (getuser(uid, &xuser) < 1) { + vmsg(" ID ぃ"); + return 0; + } + is_my_master = (strcasecmp(xuser.myangel, cuser.userid) == 0); + move(10, 0); + if (is_my_master) { + prints(ANSI_COLOR(1;32) "%s 琌" ANSI_RESET "\n", + xuser.userid); + if (xuser.timesetangel) + prints("ぱㄏ籔闽玒蝴 %d ぱ\n", + (now - xuser.timesetangel) / 86400 + 1); + if (xuser.timeplayangel) + prints("程ΩΘ\㊣(hh)丁琌 %s\n", + Cdatelite(&xuser.timeplayangel)); + } else { + prints(ANSI_COLOR(1;31) "%s ぃ琌" ANSI_RESET "\n", + xuser.userid); + } + pressanykey(); + return 0; +} + void angel_log_order_song(const char *angel_nick) { char angel_exp[STRLEN]; @@ -468,11 +501,12 @@ int a_angelreport() { prints( "\n\t 絬ぱㄏい局Τ臘计ヘ程ぶ %d 程 %d \n" "\n\t 絬秨Μぱㄏい臘程ぶ %d 程 %d \n" - "\n\t 臘﹚竡 120 ぱずΤ癸ヴ(玡ヴ)ぱㄏ肚筁癟\n", + "\n\t 臘﹚竡 %d ぱずΤ癸ヴ(玡ヴ)ぱㄏ肚筁癟\n", rpt.min_masters_of_online_angels, rpt.max_masters_of_online_angels, rpt.min_masters_of_active_angels, - rpt.max_masters_of_active_angels); + rpt.max_masters_of_active_angels, + rpt.inactive_days ? rpt.inactive_days : 120); #ifdef ANGEL_REPORT_INDEX if (HasUserPerm(PERM_ANGEL)) { diff --git a/pttbbs/mbbsd/menu.c b/pttbbs/mbbsd/menu.c index 5119d7a1..2c69fac9 100644 --- a/pttbbs/mbbsd/menu.c +++ b/pttbbs/mbbsd/menu.c @@ -682,7 +682,10 @@ static const commands_t maillist[] = { static const commands_t angelmenu[] = { {a_angelmsg, PERM_ANGEL,"Leave message 痙ē倒"}, {a_angelmsg2,PERM_ANGEL,"Call screen ㊣礶┦痙ē"}, - {a_angelreport, 0, "Report 絬ぱㄏ篈厨"}, + {angel_check_master,PERM_ANGEL, + "Master check 琩高篈"}, + // Cannot use R because r is reserved for Read/Mail due to TMENU. + {a_angelreport, 0, "PReport 絬ぱㄏ篈厨"}, {NULL, 0, NULL} }; |