summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2013-03-10 10:18:39 +0800
committerpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2013-03-10 10:18:39 +0800
commit1f76a9f133b4cd583fc9ea5eab51df3e17932d59 (patch)
treefbee0f3570d7b93fd710997d772101a7495349ad
parent1fc9fceecb38089fea450253e956eae0ac1462f5 (diff)
downloadpttbbs-1f76a9f133b4cd583fc9ea5eab51df3e17932d59.tar
pttbbs-1f76a9f133b4cd583fc9ea5eab51df3e17932d59.tar.gz
pttbbs-1f76a9f133b4cd583fc9ea5eab51df3e17932d59.tar.bz2
pttbbs-1f76a9f133b4cd583fc9ea5eab51df3e17932d59.tar.lz
pttbbs-1f76a9f133b4cd583fc9ea5eab51df3e17932d59.tar.xz
pttbbs-1f76a9f133b4cd583fc9ea5eab51df3e17932d59.tar.zst
pttbbs-1f76a9f133b4cd583fc9ea5eab51df3e17932d59.zip
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
-rw-r--r--pttbbs/daemon/angelbeats/Makefile3
-rwxr-xr-xpttbbs/daemon/angelbeats/angel_perf.py56
-rw-r--r--pttbbs/daemon/angelbeats/angelbeats.c13
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);