summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2013-03-22 13:01:30 +0800
committerpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2013-03-22 13:01:30 +0800
commit6e3f60a4bc6dbeb49d35c4b77d776c07fc85bd2f (patch)
tree292d39cb8ed0528884ba06127aabadeaafb04b3c
parent7cccbe1b6547dea2724408ec1a664548ff8405c7 (diff)
downloadpttbbs-6e3f60a4bc6dbeb49d35c4b77d776c07fc85bd2f.tar
pttbbs-6e3f60a4bc6dbeb49d35c4b77d776c07fc85bd2f.tar.gz
pttbbs-6e3f60a4bc6dbeb49d35c4b77d776c07fc85bd2f.tar.bz2
pttbbs-6e3f60a4bc6dbeb49d35c4b77d776c07fc85bd2f.tar.lz
pttbbs-6e3f60a4bc6dbeb49d35c4b77d776c07fc85bd2f.tar.xz
pttbbs-6e3f60a4bc6dbeb49d35c4b77d776c07fc85bd2f.tar.zst
pttbbs-6e3f60a4bc6dbeb49d35c4b77d776c07fc85bd2f.zip
angel: record and report last_assigned_master and misc update.
git-svn-id: http://opensvn.csie.org/pttbbs/trunk@5816 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
-rw-r--r--pttbbs/daemon/angelbeats/abc.c2
-rw-r--r--pttbbs/daemon/angelbeats/angelbeats.c42
-rw-r--r--pttbbs/include/daemons.h9
-rw-r--r--pttbbs/mbbsd/angel.c48
-rw-r--r--pttbbs/mbbsd/menu.c4
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}
};