summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2013-03-18 00:21:57 +0800
committerpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2013-03-18 00:21:57 +0800
commit14004f620e8995a9abcb4b04895f8b72707cf556 (patch)
treeb6a3d475b61dd5ce38ce2f385ab12ff7ef755344
parentc23512c1cbb65ef873cb5fa02bb908a90754c66e (diff)
downloadpttbbs-14004f620e8995a9abcb4b04895f8b72707cf556.tar
pttbbs-14004f620e8995a9abcb4b04895f8b72707cf556.tar.gz
pttbbs-14004f620e8995a9abcb4b04895f8b72707cf556.tar.bz2
pttbbs-14004f620e8995a9abcb4b04895f8b72707cf556.tar.lz
pttbbs-14004f620e8995a9abcb4b04895f8b72707cf556.tar.xz
pttbbs-14004f620e8995a9abcb4b04895f8b72707cf556.tar.zst
pttbbs-14004f620e8995a9abcb4b04895f8b72707cf556.zip
Allow new angels to be registered on demand.
git-svn-id: http://opensvn.csie.org/pttbbs/trunk@5805 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
-rw-r--r--pttbbs/daemon/angelbeats/angelbeats.c62
-rw-r--r--pttbbs/include/daemons.h2
-rw-r--r--pttbbs/include/proto.h1
-rw-r--r--pttbbs/mbbsd/angel.c8
-rw-r--r--pttbbs/mbbsd/user.c7
5 files changed, 62 insertions, 18 deletions
diff --git a/pttbbs/daemon/angelbeats/angelbeats.c b/pttbbs/daemon/angelbeats/angelbeats.c
index a0a32129..9dc16ce3 100644
--- a/pttbbs/daemon/angelbeats/angelbeats.c
+++ b/pttbbs/daemon/angelbeats/angelbeats.c
@@ -17,6 +17,7 @@
// and/or other materials provided with the distribution.
// --------------------------------------------------------------------------
// TODO cache report results.
+// TODO add blame records
#include <stdio.h>
#include <stdlib.h>
@@ -84,7 +85,18 @@ typedef struct {
int samples;
int pause1;
int pause2;
- // TODO add number of being asked, and providing replies.
+ // Records for that master can't find angel.
+ int blamed_pause1;
+ int blamed_pause2;
+ int blamed_not_online;
+ int blamed_other;
+ time4_t last_blame;
+ // Records for that angel was pinged by master.
+ int ping;
+ time4_t last_pinged;
+ // Records for that angel has replied master's ping.
+ int reply;
+ time4_t last_replied;
} PerfData;
typedef struct {
@@ -261,8 +273,10 @@ suggest_online_angel(int master_uid) {
size_t i;
int is_pause, logins;
int uid = 0;
+#ifdef TRACE_ANGEL_SELECTION
time_t clk = time(0);
int found = 0;
+#endif
AngelInfo *kanade = g_angel_list;
#ifdef ANGELBEATS_ASSIGN_BY_RANDOM
@@ -282,16 +296,21 @@ suggest_online_angel(int master_uid) {
if (is_pause)
continue;
+#ifdef TRACE_ANGEL_SELECTION
+ log("\n %d.%*s(masters=%d,act=%d,assigned=%d) ", ++found, IDLEN,
+ kanade->userid, kanade->masters,
+ (int)(clk - kanade->last_activity),
+ (int)(clk - kanade->last_assigned));
+#endif
+
#if defined(ANGELBEATS_ASSIGN_BY_LAST_ACTIVITY)
if (!uid)
uid = kanade->uid;
-
- if (found++ > 5)
+#ifndef TRACE_ANGEL_SELECTION
+ if (uid)
break;
- log("%d.%s(masters=%d,act=%d,assigned=%d) ", found,
- kanade->userid, kanade->masters,
- (int)(clk - kanade->last_activity),
- (int)(clk - kanade->last_assigned));
+#endif
+
#elif defined(ANGELBEATS_ASSIGN_BY_RANDOM)
random_uids[crandom_uids++] = kanade->uid;
if (crandom_uids >= ANGELBEATS_RANDOM_RANGE)
@@ -529,7 +548,9 @@ void load_state_data() {
}
void save_state_data() {
- FILE *fp = fopen(ANGEL_STATE_FILE, "wt");
+ const char *fname_new = ANGEL_STATE_FILE ".new",
+ *fname_old = ANGEL_STATE_FILE ".old";
+ FILE *fp = fopen(fname_new, "wt");
size_t i;
AngelInfo *kanade = g_angel_list;
if (!fp)
@@ -543,6 +564,8 @@ void save_state_data() {
kanade->perf.samples, kanade->perf.pause1, kanade->perf.pause2);
}
fclose(fp);
+ Rename(ANGEL_STATE_FILE, fname_old);
+ Rename(fname_new, ANGEL_STATE_FILE);
}
void export_perf_data(FILE *fp) {
@@ -617,7 +640,7 @@ client_cb(int fd, short event, void *arg) {
debug("got request: %d\n", data.operation);
switch(data.operation) {
case ANGELBEATS_REQ_INVALID:
- error("%s got invalid request [%s/%s]\n",
+ error("%s invalid request [%s/%s]\n",
Cdatelite(&clk), master_uid, angel_uid);
break;
case ANGELBEATS_REQ_RELOAD:
@@ -625,7 +648,7 @@ client_cb(int fd, short event, void *arg) {
init_angel_list();
break;
case ANGELBEATS_REQ_SUGGEST_AND_LINK:
- log("%s request suggest&link from [%s], ",
+ 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) {
@@ -637,18 +660,26 @@ client_cb(int fd, short event, void *arg) {
log("result: [%s]\n", data.angel_uid > 0 ? angel_uid : "<none>");
break;
case ANGELBEATS_REQ_REMOVE_LINK:
- log("%s request remove link by "
- "master [%s] to angel [%s]\n",
+ log("%s master [%s] request remove link with angel [%s]\n",
Cdatelite(&clk), master_uid, angel_uid);
if (dec_angel_master(data.angel_uid))
angel_list_sort();
break;
case ANGELBEATS_REQ_HEARTBEAT:
- log("%s update angel activity to [%s]\n",
- Cdatelite(&clk), angel_uid);
+ log("%s master [%s] update angel activity with angel [%s]\n",
+ Cdatelite(&clk), master_uid, angel_uid);
if (touch_angel_activity(data.angel_uid))
angel_list_sort();
break;
+ case ANGELBEATS_REQ_REG_NEW:
+ log("%s admin [%s] register new angel [%s]\n",
+ Cdatelite(&clk), master_uid, angel_uid);
+ // Note: Angel permission may be not set yet.
+ if (*angel_uid) {
+ angel_list_add(angel_uid, data.angel_uid);
+ angel_list_sort();
+ }
+ break;
case ANGELBEATS_REQ_EXPORT_PERF:
log("%s export_perf_data\n", Cdatelite(&clk));
{
@@ -665,7 +696,8 @@ client_cb(int fd, short event, void *arg) {
}
break;
case ANGELBEATS_REQ_REPORT:
- log("%s report by [%s]\n", Cdatelite(&clk), master_uid);
+ log("%s angel [%s] request for report\n",
+ Cdatelite(&clk), master_uid);
{
angel_beats_report rpt = {0};
rpt.cb = sizeof(rpt);
diff --git a/pttbbs/include/daemons.h b/pttbbs/include/daemons.h
index 86015d9a..03714801 100644
--- a/pttbbs/include/daemons.h
+++ b/pttbbs/include/daemons.h
@@ -74,6 +74,8 @@ enum ANGELBEATS_OPERATIONS {
ANGELBEATS_REQ_HEARTBEAT,
ANGELBEATS_REQ_GET_ONLINE_LIST,
ANGELBEATS_REQ_EXPORT_PERF,
+ ANGELBEATS_REQ_REG_NEW,
+ ANGELBEATS_REQ_BLAME,
};
typedef struct {
diff --git a/pttbbs/include/proto.h b/pttbbs/include/proto.h
index 3d8f030b..b9f69b3e 100644
--- a/pttbbs/include/proto.h
+++ b/pttbbs/include/proto.h
@@ -36,6 +36,7 @@ int a_angelmsg2(void);
int a_angelreport(void);
int a_angelreload(void);
int angel_reject_me(userinfo_t * uin);
+void angel_register_new(const char *userid);
void angel_notify_activity(const char *userid);
void angel_log_order_song(const char *angel_nick);
const char *angel_order_song(char *receiver, size_t sz_receiver);
diff --git a/pttbbs/mbbsd/angel.c b/pttbbs/mbbsd/angel.c
index a3ff4f3d..98e208e0 100644
--- a/pttbbs/mbbsd/angel.c
+++ b/pttbbs/mbbsd/angel.c
@@ -62,6 +62,12 @@ angel_beats_do_request(int op, int master_uid, int angel_uid) {
/////////////////////////////////////////////////////////////////////////////
// Local Angel Service
+void
+angel_register_new(const char *userid) {
+ angel_beats_do_request(ANGELBEATS_REQ_REG_NEW, usernum,
+ searchuser(userid, NULL));
+}
+
void
angel_notify_activity(const char *userid) {
int master;
@@ -99,7 +105,7 @@ angel_toggle_pause()
// pmore_QuickRawModePref-like conf
currutmp->angelpause = vs_quick_pref(
currutmp->angelpause % ANGELPAUSE_MODES,
- "設定小天使神諭呼叫器",
+ "設定小天使神諭呼叫器(可直接按數字選取,方便設定熱鍵也避免誤按)",
"請選取神諭呼叫器的新狀態: ",
"開放\t停收\t關閉",
NULL) % ANGELPAUSE_MODES;
diff --git a/pttbbs/mbbsd/user.c b/pttbbs/mbbsd/user.c
index 7f917eb3..c3fd006c 100644
--- a/pttbbs/mbbsd/user.c
+++ b/pttbbs/mbbsd/user.c
@@ -1240,8 +1240,11 @@ uinfo_query(const char *orig_uid, int adminmode, int unum)
post_change_perm(changefrom, x.userlevel, cuser.userid, x.userid);
#ifdef PLAY_ANGEL
// TODO notify Angelbeats
- if (x.userlevel & ~changefrom & PERM_ANGEL)
- mail_id(x.userid, "翅膀長出來了!", "etc/angel_notify", "[天使公會]");
+ if (x.userlevel & ~changefrom & PERM_ANGEL) {
+ angel_register_new(x.userid);
+ mail_id(x.userid, "翅膀長出來了!", "etc/angel_notify",
+ "[天使公會]");
+ }
#endif
}