Color a Badge Based on the Weeks the Member is Active in the Latest Sequence

Hi Ravinder,

Could you (and anyone else who wants to help out) check this PHP code and confirm it does what I expect it to do, which is to color a badge based on the weeks a member is active in the latest sequence? I did a cut-paste-change from my "days in sequence" PHP prototype script and it would be great if someone could check it.

Thanks.

<?php
$weekago = time() -  60 * 60 * 24 * 7;
$incrementseq = "UPDATE user SET lastweekactive = (UNIX_TIMESTAMP()/(60*60*24*7)), weeksinsequence =  weeksinsequence +1 WHERE userid =" . $uid;
$selectweek = "SELECT lastweekactive AS lastactive FROM user WHERE userid =" . $uid;
$resetweek = "UPDATE user SET lastweekactive = (UNIX_TIMESTAMP()/(60*60*24*7)), weeksinsequence =  1 WHERE userid =" . $uid;
$week = $vbulletin->db->query_first($selectweek);
if ($week['lastactive'] > $weekago && $week['lastactive'] <= $weekago * 2) {
    $status = $vbulletin->db->query_write($incrementseq);
} elseif ($week['lastactive'] > $weekago * 2) {
    $status = $vbulletin->db->query_write($resetweek);
}
$getseq = "SELECT weeksinsequence AS weeksactive FROM user WHERE userid =" . $uid;
$weeks = $vbulletin->db->query_first($getseq);
if ($weeks['weeksactive'] > 7) {
    $color['fahistory'] = 'black';
} elseif ($weeks['weeksactive'] > 3) {
    $color['fahistory'] = 'indigo';
} elseif ($weeks['weeksactive'] > 2) {
    $color['fahistory'] = 'blue';
} elseif ($weeks['weeksactive'] > 1) {
    $color['fahistory'] = 'limegreen';
} else {
    $color['fahistory'] = 'lightgray';
}
$badgejs .= 'badge["falaptopcode"] = "' . $color['fahistory'] . '";';
$badgejs .= 'badge["falaptopcode"] = "' . number_format($weeks['weeksactive']) . '";';

OK.. this new badge is working OK it seems, will test over time to insure it works properly.

TODO is to get the number of badged changed / awarded and the names of those badges to persist in the alert message. At the moment, there is a small bug in the state management (state management of how to time, persist and clear the changes text) of the updated badges which effects only the details in the alert message text (minor issue).

1 Like

PS:

I forgot to mention that I set all forum members to 8 weeks active in a row (black). This means that that single badge will reset to light gray when a user is not active for a week; but anyone who remains active on a weekly basis, that badge (the Weeks Active in a Row Badge) will remain black.

This helps me test as well, since most members "weeks active in a row badge" will change from black to gray a week from now, if my code logic is working as I think it should.

Update: After testing, reset all members who have not been active in the past week, as follows:

UPDATE user SET lastweekactive = (lastactivity/(60*60*24*7)), weeksinsequence =  0  WHERE lastactivity < (UNIX_TIMESTAMP() - 3600*24*8);

Update:

There is a bug in this "weeks in sequence" badging code.

Please ignore any "badge updates" related to this badge until I can find the bug and squash it.

Thanks.

Update:

Currently running this code for the "weeks in sequence badge"... I think I found the bug:

<?php
$aweekinunixtime = 60 * 60 * 24 * 7;
$weekago = (time() - $aweekinunixtime) / $aweekinunixtime;
$twoweeksago = (time() - $aweekinunixtime * 2) / $aweekinunixtime;
$incrementseq = "UPDATE user SET lastweekactive = (UNIX_TIMESTAMP()/(60*60*24*7)), weeksinsequence =  weeksinsequence +1 WHERE userid =" . $uid;
$selectweek = "SELECT lastweekactive AS lastactiveweek FROM user WHERE userid =" . $uid;
$resetweek = "UPDATE user SET lastweekactive = (UNIX_TIMESTAMP()/(60*60*24*7)), weeksinsequence =  1 WHERE userid =" . $uid;
$week = $vbulletin->db->query_first($selectweek);
if ($week['lastactiveweek'] < $weekago && $week['lastactiveweek'] >= $twoweeksago ) {
    $status = $vbulletin->db->query_write($incrementseq);
} elseif ($week['lastactiveweek'] < $twoweeksago) {
    $status = $vbulletin->db->query_write($resetweek);
}
$getseq = "SELECT weeksinsequence AS weeksactive FROM user WHERE userid =" . $uid;
$weeks = $vbulletin->db->query_first($getseq);
if ($weeks['weeksactive'] > 7) {
    $color['fahistory'] = 'black';
} elseif ($weeks['weeksactive'] > 3) {
    $color['fahistory'] = 'indigo';
} elseif ($weeks['weeksactive'] > 2) {
    $color['fahistory'] = 'blue';
} elseif ($weeks['weeksactive'] > 1) {
    $color['fahistory'] = 'limegreen';
} else {
    $color['fahistory'] = 'lightgray';
}

FYI, MySQL fields above:

| weeksinsequence           | smallint(5) unsigned|
| lastweekactive            | float unsigned      |
| lastactivity              | int(10) unsigned   |

Trigger on each page hit (in a global init file), as follows:

    <?php
    ...
    ...
    $now = time(); 
    $limit = 60 * 3; 
    if (isset($_COOKIE['badgeshashtime'])) { 
        $prior_time = $_COOKIE['badgeshashtime']; 
        $diff = $now - $prior_time; 
    } else { 
        setcookie("badgeshashtime", $now); 
        setcookie("badgeshash", $hash);   // NOT USED YET 
        $diff = $now; 
    } 
   
    if ($diff > $limit) { 
    // do the badge update dance
   }

  ...

So basically, all badges are checked and updated updates every 180 seconds or more based on the registered user's browsing habits, which is reasonable (3 minutes).

Since generally the $_COOKIE['badgeshashtime'] is normally set for all normal users with (99.999% have cookies enabled); this generally fires off every 3 minutes (checks) when a registered user in on the site, and of course, if they go have a glass of milk, it will check when they return, unless that are really fast to the frig.