diff options
-rw-r--r-- | pttbbs/daemon/angelbeats/abc.c | 2 | ||||
-rw-r--r-- | pttbbs/daemon/angelbeats/angelbeats.c | 42 | ||||
-rw-r--r-- | pttbbs/include/daemons.h | 9 | ||||
-rw-r--r-- | pttbbs/mbbsd/angel.c | 48 | ||||
-rw-r--r-- | pttbbs/mbbsd/menu.c | 4 |
5 files changed, 58 insertions, 47 deletions
diff --git a/pttbbs/daemon/angelbeats/abc.c b/pttbbs/daemon/angelbeats/abc.c index ed9a7bb3..a17b4849 100644 --- a/pttbbs/daemon/angelbeats/abc.c +++ b/pttbbs/daemon/angelbeats/abc.c @@ -57,6 +57,8 @@ int main(int argc, char *argv[]) } } else if (strcmp(argv[1], "list") == 0) { req.operation = ANGELBEATS_REQ_GET_ONLINE_LIST; + } else if (strcmp(argv[1], "save") == 0) { + req.operation = ANGELBEATS_REQ_SAVE_STATE; } else if (strcmp(argv[1], "perf") == 0) { req.operation = ANGELBEATS_REQ_EXPORT_PERF; } else { diff --git a/pttbbs/daemon/angelbeats/angelbeats.c b/pttbbs/daemon/angelbeats/angelbeats.c index 4cf7c657..2c2c0b0e 100644 --- a/pttbbs/daemon/angelbeats/angelbeats.c +++ b/pttbbs/daemon/angelbeats/angelbeats.c @@ -78,7 +78,7 @@ static int debug = 0; #ifndef ANGEL_STATE_FILE #define ANGEL_STATE_FILE BBSHOME "/log/angel_state.txt" #endif -#define ANGEL_STATE_VERSION (1) +#define ANGEL_STATE_VERSION (2) ////////////////////////////////////////////////////////////////////////////// // AngelInfo list operation @@ -114,6 +114,7 @@ typedef struct { PerfData perf; time_t last_activity; // last known activity from master time_t last_assigned; // last time being assigned with new master + int last_assigned_master; // uid of last new master int uid; int masters; // counter of who have this one as angel char userid[IDLEN+1]; @@ -347,13 +348,14 @@ suggest_online_angel(int master_uid) { } int -inc_angel_master(int uid) { +inc_angel_master(int uid, int master_uid) { AngelInfo *kanade = angel_list_find_by_uid(uid); time_t now = time(0); if (!kanade) return 0; kanade->masters++; kanade->last_assigned = now; + kanade->last_assigned_master = master_uid; return 1; } @@ -501,6 +503,8 @@ create_angel_report(int myuid, angel_beats_report *prpt) { // report my information if (myuid > 0 && (kanade = angel_list_find_by_uid(myuid))) { prpt->my_active_masters = kanade->masters; + prpt->last_assigned = kanade->last_assigned; + prpt->last_assigned_master = kanade->last_assigned_master; } return 0; } @@ -536,7 +540,7 @@ void print_dash(FILE *fp, int len, const char *prefix) { void load_state_data() { int version = -1, i = 0; - int activity, assigned; + int activity, assigned, assigned_master; char uid[256]; PerfData d; AngelInfo *kanade; @@ -545,21 +549,35 @@ void load_state_data() { return; if (fscanf(fp, "%d\n", &version) != 1 || - version != ANGEL_STATE_VERSION) { + (version != 1 && version != ANGEL_STATE_VERSION)) { error("Invalid state file (version=%d)\n", version); fclose(fp); return; } fscanf(fp, "%d %d\n", &g_perf.start, &g_perf.samples); - while (fscanf(fp, "%s %d %d %d %d %d\n", - uid, &activity, &assigned, - &d.samples, &d.pause1, &d.pause2) == 6) { + if (version == 1) { + while (fscanf(fp, "%s %d %d %d %d %d\n", + uid, &activity, &assigned, + &d.samples, &d.pause1, &d.pause2) == 6) { + i++; + kanade = angel_list_find_by_userid(uid); + if (!kanade) + continue; + kanade->last_activity = activity; + kanade->last_assigned = assigned; + kanade->last_assigned_master = 0; + memcpy(&kanade->perf, &d, sizeof(d)); + } + } else while (fscanf(fp, "%s %d %d %d %d %d %d\n", + uid, &activity, &assigned, &assigned_master, + &d.samples, &d.pause1, &d.pause2) == 7) { i++; kanade = angel_list_find_by_userid(uid); if (!kanade) continue; kanade->last_activity = activity; kanade->last_assigned = assigned; + kanade->last_assigned_master = assigned_master; memcpy(&kanade->perf, &d, sizeof(d)); } log("%s: got %d records.\n", __func__, i); @@ -577,9 +595,10 @@ void save_state_data() { fprintf(fp, "%d\n%d %d\n", ANGEL_STATE_VERSION, g_perf.start, g_perf.samples); for (i = 0; i < g_angel_list_size; i++, kanade++) { - fprintf(fp, "%s %d %d %d %d %d\n", + fprintf(fp, "%s %d %d %d %d %d %d\n", kanade->userid, (int)kanade->last_activity, (int)kanade->last_assigned, + kanade->last_assigned_master, kanade->perf.samples, kanade->perf.pause1, kanade->perf.pause2); } fclose(fp); @@ -666,12 +685,17 @@ client_cb(int fd, short event, void *arg) { log("%s reload\n", Cdatelite(&clk)); init_angel_list(); break; + case ANGELBEATS_REQ_SAVE_STATE: + log("%s save\n", Cdatelite(&clk)); + save_state_data(); + break; + case ANGELBEATS_REQ_SUGGEST_AND_LINK: 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) { - inc_angel_master(data.angel_uid); + inc_angel_master(data.angel_uid, data.master_uid); uid = getuserid(data.angel_uid); strlcpy(angel_uid, uid, sizeof(angel_uid)); angel_list_sort(); diff --git a/pttbbs/include/daemons.h b/pttbbs/include/daemons.h index 03714801..634a3ff4 100644 --- a/pttbbs/include/daemons.h +++ b/pttbbs/include/daemons.h @@ -76,6 +76,7 @@ enum ANGELBEATS_OPERATIONS { ANGELBEATS_REQ_EXPORT_PERF, ANGELBEATS_REQ_REG_NEW, ANGELBEATS_REQ_BLAME, + ANGELBEATS_REQ_SAVE_STATE, }; typedef struct { @@ -91,13 +92,21 @@ typedef struct { short total_angels; short total_online_angels; short total_active_angels; + short min_masters_of_online_angels; short max_masters_of_online_angels; short min_masters_of_active_angels; short max_masters_of_active_angels; + short my_index; short my_active_index; short my_active_masters; + short reserved; + + time4_t last_assigned; + time4_t reserved2; + int last_assigned_master; + } angel_beats_report ; #define ANGELBEATS_UID_LIST_SIZE (20) diff --git a/pttbbs/mbbsd/angel.c b/pttbbs/mbbsd/angel.c index ed1732a5..529e9d81 100644 --- a/pttbbs/mbbsd/angel.c +++ b/pttbbs/mbbsd/angel.c @@ -21,10 +21,12 @@ static const char *PROMPT_ANGELBEATS = " Angel Beats! �ѨϤ��| ", -*ERR_CONNECTION = "��p�A�L�k�s�u�ܤѨϤ��|�C\n" - "�Ц� " BN_BUGREPORT " �ݪO�q������z�H���C\n", -*ERR_PROTOCOL = "��p�A�ѨϤ��|�s�u���`�C\n" - "�Ц� " BN_BUGREPORT " �ݪO�q������z�H���C\n"; +*ERR_CONNECTION = "��p�A�L�k�s�u�ܤѨϤ��|�A�еy��A�աC\n" + "�Y����o�ͽЦ� " BN_BUGREPORT " �ݪO�q������z�H���C\n", +*ERR_PROTOCOL = "��p�A�ѨϤ��|�s�u���`�A�еy��A�աC\n" + "�Y����o�ͽЦ� " BN_BUGREPORT " �ݪO�q������z�H���C\n", +*ERR_PROTOCOL2 = "��p�A�ѨϤ��|���G�w��s�A�Э��s�n�J�C\n" + "�Y�n�J�ᤴ���~�Ц� " BN_BUGREPORT " �ݪO�q������z�H���C\n"; ///////////////////////////////////////////////////////////////////////////// // Angel Beats! Client @@ -449,9 +451,10 @@ int a_angelreport() { req.angel_uid = usernum; if (towrite(fd, &req, sizeof(req)) < 0 || - toread(fd, &rpt, sizeof(rpt)) < 0 || - rpt.cb != sizeof(rpt)) { + toread(fd, &rpt, sizeof(rpt)) < 0) { outs(ERR_PROTOCOL); + } else if (rpt.cb != sizeof(rpt)) { + outs(ERR_PROTOCOL2); } else { prints( "\t �{�b�ɶ�: %s\n\n" @@ -484,40 +487,17 @@ int a_angelreport() { } #endif prints("\n\t �z�ثe�j���� %d �쬡�D�p�D�H�C\n", rpt.my_active_masters); + if (rpt.last_assigned_master > 0) { + prints("\n\t �̫�쪺�s�p�D�H�O %s (%s)\n", + getuserid(rpt.last_assigned_master), + Cdatelite(&rpt.last_assigned)); + } } close(fd); pressanykey(); return 0; } -int a_angelreload() { - vs_hdr2(" Angel Beats! �ѨϤ��| ", " ����Ѩϸ�T "); - outs("\n" - "\t �ѩs�έp�ѨϤp�D�H�ƥثD�`��ɶ��A�ҥH�ثe�t��\n" - "\t �@��u�|��s�w�����ѨϡC �Y���観�s�W�ΧR���ѨϮ�\n" - "\t �Цb�粒�Ҧ��Ѩ��v����Q�Φ��\\��ӭ���Ѩϸ�T�C\n" - "\n" - "\t �t�~�ѩ�ɩҦ���ѨϦ������\\�ೣ�|�Ȱ� 30 �� ~ �@������A\n" - "\t �Ф��n�S�ƴN����A�ӬO�u�����վ�ѨϦW���~�ϥΡC\n"); - if (vans("�аݽT�w�n����Ѩϸ�T�F��? [y/N]: ") != 'y') { - vmsg("���C"); - return 0; - } - - move(1, 0); clrtobot(); - outs("\n�s�u��...\n"); refresh(); - - if (angel_beats_do_request(ANGELBEATS_REQ_RELOAD, usernum, 0) < 0) { - outs("��p�A�L�k�s�u�ܤѨϤ��|�C\n" - "�Ц� " BN_BUGREPORT " �ݪO�q������z�H���C\n"); - } else { - outs("\n����!\n"); - } - - pressanykey(); - return 0; -} - inline int angel_reject_me(userinfo_t * uin){ int* iter = uin->reject; diff --git a/pttbbs/mbbsd/menu.c b/pttbbs/mbbsd/menu.c index 5b5f664f..5119d7a1 100644 --- a/pttbbs/mbbsd/menu.c +++ b/pttbbs/mbbsd/menu.c @@ -683,10 +683,6 @@ static const commands_t angelmenu[] = { {a_angelmsg, PERM_ANGEL,"Leave message �d�����p�D�H"}, {a_angelmsg2,PERM_ANGEL,"Call screen �I�s�e���өʯd��"}, {a_angelreport, 0, "Report �u�W�ѨϪ��A���i"}, -#ifdef ANGEL_ALLOW_MENU_RELOAD - // This will corrupt perf data; let's do that weekly. - {a_angelreload, PERM_SYSOP,"OReload ����Ѩϸ�T"}, -#endif {NULL, 0, NULL} }; |