0

我想为基于社区的网站中的用户记录某种成就。这个想法是为连续 5 天登录或整个月的每个周末一次登录提供成就。

我也会给出获得 100 个帖子的成就,但这很容易确定。我认为我刚刚给出的基于时间的例子有点难。

如何制作某种通用系统来计算每个用户的这些指标?或者我最终会得到一个包含“every_weekend_for_month”和“5_days_in_a_row”等字段的大表,一旦这些整数达到4和5,它们就被“实现”了。但是,对于这两个领域,我也必须保持上周末/天的得分。

4

2 回答 2

1

您将需要跟踪获得成就所需的所有数据(甚至是部分数据)。

对于登录的成就,您需要每天跟踪每次登录一次,有一个如下表:

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');
        }
    }

}

您基本上可以在此事件中添加有关登录的所有成就。

于 2013-08-05T21:15:28.917 回答
1

您可以跟踪所有登录并使用该数据来推断成就。跟踪和搜索个人登录可能会更慢。如果您有非常大的用户群和大量登录,那么在登录时进行这些计数可能并非易事。

如果您想更快,您可以跟踪特定成就的最后登录日期,然后增加一个听起来像您所想的计数器。

于 2013-08-05T21:20:32.953 回答