From 14004f620e8995a9abcb4b04895f8b72707cf556 Mon Sep 17 00:00:00 2001 From: piaip Date: Sun, 17 Mar 2013 16:21:57 +0000 Subject: Allow new angels to be registered on demand. git-svn-id: http://opensvn.csie.org/pttbbs/trunk@5805 63ad8ddf-47c3-0310-b6dd-a9e9d9715204 --- pttbbs/daemon/angelbeats/angelbeats.c | 62 ++++++++++++++++++++++++++--------- pttbbs/include/daemons.h | 2 ++ pttbbs/include/proto.h | 1 + pttbbs/mbbsd/angel.c | 8 ++++- pttbbs/mbbsd/user.c | 7 ++-- 5 files changed, 62 insertions(+), 18 deletions(-) diff --git a/pttbbs/daemon/angelbeats/angelbeats.c b/pttbbs/daemon/angelbeats/angelbeats.c index a0a32129..9dc16ce3 100644 --- a/pttbbs/daemon/angelbeats/angelbeats.c +++ b/pttbbs/daemon/angelbeats/angelbeats.c @@ -17,6 +17,7 @@ // and/or other materials provided with the distribution. // -------------------------------------------------------------------------- // TODO cache report results. +// TODO add blame records #include #include @@ -84,7 +85,18 @@ typedef struct { int samples; int pause1; int pause2; - // TODO add number of being asked, and providing replies. + // Records for that master can't find angel. + int blamed_pause1; + int blamed_pause2; + int blamed_not_online; + int blamed_other; + time4_t last_blame; + // Records for that angel was pinged by master. + int ping; + time4_t last_pinged; + // Records for that angel has replied master's ping. + int reply; + time4_t last_replied; } PerfData; typedef struct { @@ -261,8 +273,10 @@ suggest_online_angel(int master_uid) { size_t i; int is_pause, logins; int uid = 0; +#ifdef TRACE_ANGEL_SELECTION time_t clk = time(0); int found = 0; +#endif AngelInfo *kanade = g_angel_list; #ifdef ANGELBEATS_ASSIGN_BY_RANDOM @@ -282,16 +296,21 @@ suggest_online_angel(int master_uid) { if (is_pause) continue; +#ifdef TRACE_ANGEL_SELECTION + log("\n %d.%*s(masters=%d,act=%d,assigned=%d) ", ++found, IDLEN, + kanade->userid, kanade->masters, + (int)(clk - kanade->last_activity), + (int)(clk - kanade->last_assigned)); +#endif + #if defined(ANGELBEATS_ASSIGN_BY_LAST_ACTIVITY) if (!uid) uid = kanade->uid; - - if (found++ > 5) +#ifndef TRACE_ANGEL_SELECTION + if (uid) break; - log("%d.%s(masters=%d,act=%d,assigned=%d) ", found, - kanade->userid, kanade->masters, - (int)(clk - kanade->last_activity), - (int)(clk - kanade->last_assigned)); +#endif + #elif defined(ANGELBEATS_ASSIGN_BY_RANDOM) random_uids[crandom_uids++] = kanade->uid; if (crandom_uids >= ANGELBEATS_RANDOM_RANGE) @@ -529,7 +548,9 @@ void load_state_data() { } void save_state_data() { - FILE *fp = fopen(ANGEL_STATE_FILE, "wt"); + const char *fname_new = ANGEL_STATE_FILE ".new", + *fname_old = ANGEL_STATE_FILE ".old"; + FILE *fp = fopen(fname_new, "wt"); size_t i; AngelInfo *kanade = g_angel_list; if (!fp) @@ -543,6 +564,8 @@ void save_state_data() { kanade->perf.samples, kanade->perf.pause1, kanade->perf.pause2); } fclose(fp); + Rename(ANGEL_STATE_FILE, fname_old); + Rename(fname_new, ANGEL_STATE_FILE); } void export_perf_data(FILE *fp) { @@ -617,7 +640,7 @@ client_cb(int fd, short event, void *arg) { debug("got request: %d\n", data.operation); switch(data.operation) { case ANGELBEATS_REQ_INVALID: - error("%s got invalid request [%s/%s]\n", + error("%s invalid request [%s/%s]\n", Cdatelite(&clk), master_uid, angel_uid); break; case ANGELBEATS_REQ_RELOAD: @@ -625,7 +648,7 @@ client_cb(int fd, short event, void *arg) { init_angel_list(); break; case ANGELBEATS_REQ_SUGGEST_AND_LINK: - log("%s request suggest&link from [%s], ", + 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) { @@ -637,18 +660,26 @@ client_cb(int fd, short event, void *arg) { log("result: [%s]\n", data.angel_uid > 0 ? angel_uid : ""); break; case ANGELBEATS_REQ_REMOVE_LINK: - log("%s request remove link by " - "master [%s] to angel [%s]\n", + log("%s master [%s] request remove link with angel [%s]\n", Cdatelite(&clk), master_uid, angel_uid); if (dec_angel_master(data.angel_uid)) angel_list_sort(); break; case ANGELBEATS_REQ_HEARTBEAT: - log("%s update angel activity to [%s]\n", - Cdatelite(&clk), angel_uid); + log("%s master [%s] update angel activity with angel [%s]\n", + Cdatelite(&clk), master_uid, angel_uid); if (touch_angel_activity(data.angel_uid)) angel_list_sort(); break; + case ANGELBEATS_REQ_REG_NEW: + log("%s admin [%s] register new angel [%s]\n", + Cdatelite(&clk), master_uid, angel_uid); + // Note: Angel permission may be not set yet. + if (*angel_uid) { + angel_list_add(angel_uid, data.angel_uid); + angel_list_sort(); + } + break; case ANGELBEATS_REQ_EXPORT_PERF: log("%s export_perf_data\n", Cdatelite(&clk)); { @@ -665,7 +696,8 @@ client_cb(int fd, short event, void *arg) { } break; case ANGELBEATS_REQ_REPORT: - log("%s report by [%s]\n", Cdatelite(&clk), master_uid); + log("%s angel [%s] request for report\n", + Cdatelite(&clk), master_uid); { angel_beats_report rpt = {0}; rpt.cb = sizeof(rpt); diff --git a/pttbbs/include/daemons.h b/pttbbs/include/daemons.h index 86015d9a..03714801 100644 --- a/pttbbs/include/daemons.h +++ b/pttbbs/include/daemons.h @@ -74,6 +74,8 @@ enum ANGELBEATS_OPERATIONS { ANGELBEATS_REQ_HEARTBEAT, ANGELBEATS_REQ_GET_ONLINE_LIST, ANGELBEATS_REQ_EXPORT_PERF, + ANGELBEATS_REQ_REG_NEW, + ANGELBEATS_REQ_BLAME, }; typedef struct { diff --git a/pttbbs/include/proto.h b/pttbbs/include/proto.h index 3d8f030b..b9f69b3e 100644 --- a/pttbbs/include/proto.h +++ b/pttbbs/include/proto.h @@ -36,6 +36,7 @@ int a_angelmsg2(void); int a_angelreport(void); int a_angelreload(void); int angel_reject_me(userinfo_t * uin); +void angel_register_new(const char *userid); void angel_notify_activity(const char *userid); void angel_log_order_song(const char *angel_nick); const char *angel_order_song(char *receiver, size_t sz_receiver); diff --git a/pttbbs/mbbsd/angel.c b/pttbbs/mbbsd/angel.c index a3ff4f3d..98e208e0 100644 --- a/pttbbs/mbbsd/angel.c +++ b/pttbbs/mbbsd/angel.c @@ -62,6 +62,12 @@ angel_beats_do_request(int op, int master_uid, int angel_uid) { ///////////////////////////////////////////////////////////////////////////// // Local Angel Service +void +angel_register_new(const char *userid) { + angel_beats_do_request(ANGELBEATS_REQ_REG_NEW, usernum, + searchuser(userid, NULL)); +} + void angel_notify_activity(const char *userid) { int master; @@ -99,7 +105,7 @@ angel_toggle_pause() // pmore_QuickRawModePref-like conf currutmp->angelpause = vs_quick_pref( currutmp->angelpause % ANGELPAUSE_MODES, - "設定小天使神諭呼叫器", + "設定小天使神諭呼叫器(可直接按數字選取,方便設定熱鍵也避免誤按)", "請選取神諭呼叫器的新狀態: ", "開放\t停收\t關閉", NULL) % ANGELPAUSE_MODES; diff --git a/pttbbs/mbbsd/user.c b/pttbbs/mbbsd/user.c index 7f917eb3..c3fd006c 100644 --- a/pttbbs/mbbsd/user.c +++ b/pttbbs/mbbsd/user.c @@ -1240,8 +1240,11 @@ uinfo_query(const char *orig_uid, int adminmode, int unum) post_change_perm(changefrom, x.userlevel, cuser.userid, x.userid); #ifdef PLAY_ANGEL // TODO notify Angelbeats - if (x.userlevel & ~changefrom & PERM_ANGEL) - mail_id(x.userid, "翅膀長出來了!", "etc/angel_notify", "[天使公會]"); + if (x.userlevel & ~changefrom & PERM_ANGEL) { + angel_register_new(x.userid); + mail_id(x.userid, "翅膀長出來了!", "etc/angel_notify", + "[天使公會]"); + } #endif } -- cgit v1.2.3