diff options
-rw-r--r-- | pttbbs/daemon/angelbeats/angelbeats.c | 49 | ||||
-rw-r--r-- | pttbbs/mbbsd/angel.c | 23 |
2 files changed, 54 insertions, 18 deletions
diff --git a/pttbbs/daemon/angelbeats/angelbeats.c b/pttbbs/daemon/angelbeats/angelbeats.c index 0b52a0db..7b46eb17 100644 --- a/pttbbs/daemon/angelbeats/angelbeats.c +++ b/pttbbs/daemon/angelbeats/angelbeats.c @@ -42,6 +42,17 @@ static int verbose = 0; #define ANGELBEATS_INACTIVE_TIME ( 120 * DAY_SECONDS ) #endif +// Lower priority for re-assigning masters in given period. +#ifndef ANGELBEATS_REASSIGN_PERIOD +#define ANGELBEATS_REASSIGN_PERIOD (DAY_SECONDS) +#endif + +// Merge activities in every X seconds. +#ifndef ANGELBEATS_ACTIVITY_MERGE_PERIOD +#define ANGELBEATS_ACTIVITY_MERGE_PERIOD (15) +#endif + + ////////////////////////////////////////////////////////////////////////////// // AngelInfo list operation @@ -49,6 +60,7 @@ static int verbose = 0; typedef struct { time_t last_activity; // last known activity from master + time_t last_assigned; // last time being assigned with new master int uid; int masters; // counter of who have this one as angel char userid[IDLEN+1]; @@ -76,9 +88,11 @@ int angel_list_comp_masters(const void *pva, const void *pvb) { int angel_list_comp_advanced(const void *pva, const void *pvb) { AngelInfo *pa = (AngelInfo*) pva, *pb = (AngelInfo*) pvb; - if (pa->last_activity == pb->last_activity) - return pa->masters - pb->masters; - return pa->last_activity > pb->last_activity ? 1 : -1; + if (pa->last_assigned != pb->last_assigned) + return pa->last_assigned > pb->last_assigned ? 1 : -1; + if (pa->last_activity != pb->last_activity) + return pa->last_activity > pb->last_activity ? 1 : -1; + return pa->masters - pb->masters; } // search stubs @@ -187,9 +201,12 @@ suggest_online_angel(int master_uid) { int inc_angel_master(int uid) { AngelInfo *kanade = angel_list_find_by_uid(uid); + time_t now = time(0); if (!kanade) return 0; + now -= now % ANGELBEATS_REASSIGN_PERIOD; kanade->masters++; + kanade->last_assigned = now; return 1; } @@ -212,7 +229,7 @@ touch_angel_activity(int uid) { AngelInfo *kanade = angel_list_find_by_uid(uid); int now = (int)time(0); - now -= now % 60; + now -= now % ANGELBEATS_ACTIVITY_MERGE_PERIOD; if (!kanade || kanade->last_activity == now) return 0; @@ -283,18 +300,19 @@ create_angel_report(int myuid, angel_beats_report *prpt) { int i; AngelInfo *kanade = g_angel_list; userinfo_t *astat = NULL; + int from_cmd = (!myuid); 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; - if(debug) printf("g_angel_list_size: %d\n", g_angel_list_size); + if (from_cmd) printf("g_angel_list_size: %d\n", g_angel_list_size); for (i = 0; i < g_angel_list_size; i++, kanade++) { // online? int is_pause = 0, is_online = 0, logins = 0; - if (debug) printf(" - %03d. %s: ", i+1, kanade->userid); + if (from_cmd) fprintf(stderr, " - %03d. %-14s: ", i+1, kanade->userid); for (astat = search_ulistn(kanade->uid, 1); astat && astat->uid == kanade->uid; astat++) { @@ -302,31 +320,32 @@ create_angel_report(int myuid, angel_beats_report *prpt) { continue; logins++; if (!(astat->userlevel & PERM_ANGEL)) { // what now? - if (debug) printf("[NOT ANGEL!? skip] "); + if (from_cmd) fprintf(stderr, "[NOT ANGEL!? skip] "); is_online = is_pause = 0; break; } if (astat->angelpause) { - if (debug) printf("[set pause (%d)] ", astat->angelpause); + if (from_cmd) + fprintf(stderr, "[set PAUSE (%d)] ", astat->angelpause); is_pause = 1; } is_online = 1; } - if (debug) { - printf("(masters=%d, activity=%d, ", + if (from_cmd) { + fprintf(stderr, "(masters=%d, activity=%d, assigned=%d, ", kanade->masters, kanade->last_activity); switch(logins) { case 0: - printf("NOT online)"); + fprintf(stderr, "NOT online"); break; case 1: - printf("online)"); + fprintf(stderr, "online"); break; default: - printf("multi login: %d)", logins); + fprintf(stderr, "multi login: %d", logins); break; } - printf("\n"); + fprintf(stderr, ")\n"); } // update report numbers prpt->total_online_angels += is_online; @@ -359,7 +378,7 @@ create_angel_report(int myuid, angel_beats_report *prpt) { if (myuid > 0 && (kanade = angel_list_find_by_uid(myuid))) { prpt->my_active_masters = kanade->masters; } - if(debug) fflush(stdout); + if(from_cmd) fflush(stderr); return 0; } diff --git a/pttbbs/mbbsd/angel.c b/pttbbs/mbbsd/angel.c index 85a5fb59..a4a64099 100644 --- a/pttbbs/mbbsd/angel.c +++ b/pttbbs/mbbsd/angel.c @@ -48,6 +48,11 @@ angel_notify_activity() { static time4_t t = 0; time4_t tick = now; +#ifdef ANGEL_CIA_ACCOUNT + if (strcasecmp(cuser.userid, ANGEL_CIA_ACCOUNT) == 0) + return; +#endif + // tick: every 1 minutes. tick -= tick % (1 * 60); @@ -190,7 +195,13 @@ do_changeangel(int force) { // TODO Allow changing only if user really tried to contact angel. #ifdef ANGEL_CHANGE_TIMELIMIT_MINS - if (force) + +#ifdef ANGEL_CIA_ACCOUNT + if (strcasecmp(cuser.userid, ANGEL_CIA_ACCOUNT) == 0) + force = 1; +#endif + + if (force || HasUserPerm(PERM_ADMIN)) last_time = 0; if (last_time && @@ -574,6 +585,7 @@ TalkToAngel(){ static char AngelPermChecked = 0; static userinfo_t* lastuent = NULL; userinfo_t *uent; + static int is_new_angel = 0; if (strcmp(cuser.myangel, "-") == 0){ NoAngelFound("你沒有小天使"); @@ -591,6 +603,7 @@ TalkToAngel(){ if (cuser.myangel[0] == 0) { int ret = FindAngel(); + is_new_angel = 1; if (ret <= 0) { lastuent = NULL; NoAngelFound( @@ -637,13 +650,17 @@ TalkToAngel(){ "你可以選擇不向對方透露自己身份來保護自己 "); */ + // 為避免某些人找了小天使但又不送出訊息,在這個 stage 不顯示 nick. { char xnick[IDLEN+1], prompt[IDLEN*2]; - snprintf(xnick, sizeof(xnick), "%s小天使", _myangel_nick); - snprintf(prompt, sizeof(prompt), "問%s小天使: ", _myangel_nick); + snprintf(xnick, sizeof(xnick), "%s小天使", + is_new_angel ? "" : _myangel_nick); + snprintf(prompt, sizeof(prompt), "問%s小天使: ", + is_new_angel ? "" : _myangel_nick); // if success, record uent. if (my_write(uent->pid, prompt, xnick, WATERBALL_ANGEL, uent)) { lastuent = uent; + is_new_angel = 0; } } return; |