我想为基于社区的网站中的用户记录某种成就。这个想法是为连续 5 天登录或整个月的每个周末一次登录提供成就。
我也会给出获得 100 个帖子的成就,但这很容易确定。我认为我刚刚给出的基于时间的例子有点难。
如何制作某种通用系统来计算每个用户的这些指标?或者我最终会得到一个包含“every_weekend_for_month”和“5_days_in_a_row”等字段的大表,一旦这些整数达到4和5,它们就被“实现”了。但是,对于这两个领域,我也必须保持上周末/天的得分。
我想为基于社区的网站中的用户记录某种成就。这个想法是为连续 5 天登录或整个月的每个周末一次登录提供成就。
我也会给出获得 100 个帖子的成就,但这很容易确定。我认为我刚刚给出的基于时间的例子有点难。
如何制作某种通用系统来计算每个用户的这些指标?或者我最终会得到一个包含“every_weekend_for_month”和“5_days_in_a_row”等字段的大表,一旦这些整数达到4和5,它们就被“实现”了。但是,对于这两个领域,我也必须保持上周末/天的得分。
您将需要跟踪获得成就所需的所有数据(甚至是部分数据)。
对于登录的成就,您需要每天跟踪每次登录一次,有一个如下表:
user_id | login
1 | 2013-07-20
1 | 2013-07-19
1 | 2013-07-16
2 | 2013-07-20
...
每当触发跟踪事件时,您还会检查成就。
event onLogin {
// get the last 4 logins before the current login
statement = (
SELECT login FROM tracking_user_login
WHERE user_id = 1
ORDER BY login DESC
LIMIT 1,4
);
statement.execute();
// did the user even login at least 4 times already?
if (statement.rowCount == 4) {
date lastLogin = todaysLogin;
int consecutiveLogins = 1;
// iterate descending through the last days
foreach (row in statement) {
if (row.login == (lastLogin - 1day)) {
consecutiveLogins++; // increment consecution
lastLogin = (lastLogin - 1day); // prepare next comparison
} else {
// consecution interrupted, ignore the rest
break;
}
}
// enough to achieve something?
if (consecutiveLogins >= 5) {
user.addAchievement('5 CONSECUTIVE LOGINS');
}
}
}
您基本上可以在此事件中添加有关登录的所有成就。
您可以跟踪所有登录并使用该数据来推断成就。跟踪和搜索个人登录可能会更慢。如果您有非常大的用户群和大量登录,那么在登录时进行这些计数可能并非易事。
如果您想更快,您可以跟踪特定成就的最后登录日期,然后增加一个听起来像您所想的计数器。