summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pttbbs/daemon/angelbeats/angelbeats.c49
-rw-r--r--pttbbs/mbbsd/angel.c23
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;