From 1f76a9f133b4cd583fc9ea5eab51df3e17932d59 Mon Sep 17 00:00:00 2001 From: piaip Date: Sun, 10 Mar 2013 02:18:39 +0000 Subject: Revise report messages, use timeplayangel to replace lastlogintime, and add more debug info for suggest procedure. git-svn-id: http://opensvn.csie.org/pttbbs/trunk@5798 63ad8ddf-47c3-0310-b6dd-a9e9d9715204 --- pttbbs/daemon/angelbeats/Makefile | 3 -- pttbbs/daemon/angelbeats/angel_perf.py | 56 ++++++++++++++++++++++++---------- pttbbs/daemon/angelbeats/angelbeats.c | 13 ++++++-- 3 files changed, 51 insertions(+), 21 deletions(-) diff --git a/pttbbs/daemon/angelbeats/Makefile b/pttbbs/daemon/angelbeats/Makefile index 8d80ada6..40267d89 100644 --- a/pttbbs/daemon/angelbeats/Makefile +++ b/pttbbs/daemon/angelbeats/Makefile @@ -19,9 +19,6 @@ all: ${PROGRAMS} .cpp.o: $(CXX) $(CXXFLAGS) -c $*.cpp -ctags: - ctags *.[ch] $(SRCROOT)/include/*.h $(SRCROOT)/common/*/*.[ch] - angelbeats: angelbeats.o ${CC} ${CFLAGS} ${LDFLAGS} -o $@ $> $(UTILOBJ) $(LDLIBS) diff --git a/pttbbs/daemon/angelbeats/angel_perf.py b/pttbbs/daemon/angelbeats/angel_perf.py index 8bb014a9..d33f79e6 100755 --- a/pttbbs/daemon/angelbeats/angel_perf.py +++ b/pttbbs/daemon/angelbeats/angel_perf.py @@ -13,33 +13,55 @@ SAMPLE_MINIMAL = 200 Entry = collections.namedtuple('Entry', 'sample pause1 pause2 max avg std') DEBUG = None +REPORT_SAMPLE_STAT = False -PREFIX_DOC = ''' -== 本週小天使活動資料統計結果 (系統自動產生: %s) == +PREFIX_DOC = '''== 本週小天使查翅膀建議名單 (系統自動產生: %s) == 說明: 天使公會在新小主人找天使時即時統計所有的小天使狀態, - 得到 (1) 小天使當時是否在線上 (2) 神諭呼叫器是否停收/關閉; - 基於上面結果可分析出下列名單。 - - 小天使名稱後面的數字為該小天使被統計到的次數 (以下稱 SAMPLE 數), - 因為 SAMPLE 數字是有人呼叫時才會更新,且為避免惡意洗數字造成結果不公, - 統計每 600 秒最多更新一次(否則有人會趁自己上線開分身狂換小天使), - 所以此數字大略上接近(但不等於)小天使實際上線時間比例。 - - 換句話說,即使為零也不代表此小天使都沒上線過,可能只是上線停留時間都 - 過短或是上線時都沒有新使用者要呼叫小天使。 + 確認 (1) 小天使當時是否在線上 (2) 神諭呼叫器是否停收/關閉。 + 依據天使之書對於查翅膀的定義「抽查到太多次都沒開啟呼叫器」, + 若上線時間過少或是關呼叫時間過高則會出現在每週統計的名單中, + 以供品管及大天使參考。 ([關呼叫] 現在為「關閉」與「停收」的合計) + + ** 為幫助理解名單產生方法及數字意義,簡單例子如下: 若有小天使 ABC 三名, + A 在線上開呼叫, B 在線上但關呼叫, C 不在線上: + 某日早上 10:20 有某使用者(無天使)按下 hh 找新天使,系統就會記錄: + [ID] [線上] [關呼叫] + A 1 0 + B 1 1 + C 0 0 + 10:21 有一使用者換天使;但為避免有人洗數字,所以統計 + 每10分鐘最多一次;因此這次呼叫不會改變統計結果 + 10:30 十分鐘已到,系統已可再次統計 (但不主動執行) + 10:31 該使用者與小天使A在互丟水球 (丟水球不統計) + 10:32 C 上線了 (也還不統計 - 只在有人找/換天使才算) + 10:33 A 改為停收 (也還不統計 - 只在有人找/換天使才算) + 10:35 又有一使用者找新天使,系統更改記錄如下: + (ABC都在線上,AB關呼叫,C開呼叫) + [ID] [線上] [關呼叫] + A 1+1=2 0+1=1 + B 1+1=2 1+1=2 + C 0+1=1 0+0=0 + 且下次可統計時間為 10:45 之後。 ''' % (time.ctime()) +# 小天使名稱後面的數字為該小天使被統計到的次數 (以下稱 SAMPLE 數), +# 因為 SAMPLE 數字是有人呼叫時才會更新,且為避免惡意洗數字造成結果不公, +# 統計每 600 秒最多更新一次(否則有人會趁自己上線開分身狂換小天使), +# 所以此數字大略上接近(但不等於)小天使實際上線時間比例。 +# +# 換句話說,即使為零也不代表此小天使都沒上線過,可能只是上線停留時間都 +# 過短或是上線時都沒有新使用者要呼叫小天使。 def is_lazy(e): # 'LAZY' - '\033[1;33m以下是這段時間內SAMPLE數過低的小天使:\033[m' + '\033[1;33m以下是[線上]統計結果過低(小於5)的小天使\033[m' # return e.sample < (e.avg - 1.0 * e.std) return e.sample < 5 def is_all_reject2(e): # 'ALL_REJECT2' - '\033[1;31m以下是呼叫器關閉/停收時間比例過高(與SAMPLE相差小於2)的小天使:\033[m' + '\033[1;31m以下是[關呼叫]統計比例過高([線上]減[關呼叫]小於2)的小天使\033[m' return (e.pause2 + e.pause1 >= e.sample - 1) def parse_perf_file(filename): @@ -79,7 +101,7 @@ def build_badges(max_sample, avg_sample, std_sample, data): result = {} filters = [is_all_reject2] for uid, e in data.items(): - nick = '%s (%d)' % (get_nick(uid), e[0]) + nick = '%s (線上%d 關呼叫%d)' % (get_nick(uid), e[0], e[1]+e[2]) if DEBUG: nick += ' {%s/%d/%d/%d}' % (uid, e[0], e[1], e[2]) entry = Entry(e[0], e[1], e[2], max_sample, avg_sample, std_sample) @@ -102,9 +124,11 @@ def main(): print PREFIX_DOC if DEBUG: print 'max, avg, std: %d, %d, %d' % (max_sample, avg_sample, std_sample) - else: + elif REPORT_SAMPLE_STAT: print ' SAMPLE 數最大值 / 平均 / 標準差: %d / %d / %d\n' % ( max_sample, avg_sample, std_sample) + else: + pass result = build_badges(max_sample, avg_sample, std_sample, data) for k, v in result.items(): print '%s:\n %s\n' % (k, '\n '.join(v)) diff --git a/pttbbs/daemon/angelbeats/angelbeats.c b/pttbbs/daemon/angelbeats/angelbeats.c index f1c1d137..bcf3872e 100644 --- a/pttbbs/daemon/angelbeats/angelbeats.c +++ b/pttbbs/daemon/angelbeats/angelbeats.c @@ -223,6 +223,7 @@ suggest_online_angel(int master_uid) { int uid = 0, do_perf = 0; static time_t perf_time = 0; time_t clk = time(0); + int found = 0; #ifdef ANGELBEATS_ASSIGN_BY_RANDOM int random_uids[ANGELBEATS_RANDOM_RANGE]; @@ -246,13 +247,21 @@ suggest_online_angel(int master_uid) { #if defined(ANGELBEATS_ASSIGN_BY_LAST_ACTIVITY) // select if angel is online and not paused. - if (!uid && !is_pause) + if (!uid && !is_pause) { uid = kanade->uid; + if (found++ < 5) { + fprintf("%d.%s(assigned=%d/act=%d) ", found, + kanade->userid, kanade->masters, + kanade->last_activity - clk, + kanade->last_assigned - clk); + } + } #elif defined(ANGELBEATS_ASSIGN_BY_RANDOM) if (!uid && !is_pause) random_uids[crandom_uids++] = kanade->uid; #endif + // update perf data; otherwise abort. if (do_perf) { kanade->perf.samples++; @@ -339,7 +348,7 @@ init_angel_list_callback(void *ctx GCC_UNUSED, int uidx, userec_t *u) { // skip inactive users. however, this makes the counter // incorrect when those kind of use goes online. // anyway that should not be a big change... - if (time4(0) > u->lastlogin + ANGELBEATS_INACTIVE_TIME ) + if (time4(0) > u->timeplayangel + ANGELBEATS_INACTIVE_TIME ) return 0; kanade = angel_list_find_by_userid(u->myangel); -- cgit v1.2.3