summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2013-03-22 22:04:24 +0800
committerpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2013-03-22 22:04:24 +0800
commit7b2b7df82f51e2bb8fe88107c412824023b7dbcb (patch)
treea431567496e3825988921c4bc7be963caa1034dd
parentc741f36c7c69f901098f3cf641c3716928fd8fbe (diff)
downloadpttbbs-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.c55
-rw-r--r--pttbbs/include/daemons.h8
-rw-r--r--pttbbs/include/proto.h1
-rw-r--r--pttbbs/mbbsd/angel.c48
-rw-r--r--pttbbs/mbbsd/menu.c5
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}
};