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

Tags
badging system, based, color, forum development, latest, php, sequence, web programming

 
Thread Tools Search this Thread
# 1  
Old 2 Weeks Ago
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.

Code:
<?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']) . '";';

# 2  
Old 2 Weeks Ago
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).


Image
This User Gave Thanks to Neo For This Post:
RavinderSingh13 (2 Weeks Ago)
# 3  
Old 2 Weeks Ago
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.
# 4  
Old 1 Week Ago
Update: After testing, reset all members who have not been active in the past week, as follows:

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

# 5  
Old 1 Week Ago
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.
# 6  
Old 1 Week Ago
Update:

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

Code:
<?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';
}

# 7  
Old 1 Week Ago
FYI, MySQL fields above:

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

Trigger on each page hit (in a global init file), as follows:
Code:
    <?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.

|
Thread Tools Search this Thread
Search this Thread:
Advanced Search

More UNIX and Linux Forum Topics You Might Find Helpful
Update to Posts - Member Info Icon and Badge Neo What is on Your Mind? 22 07-24-2018 12:23 AM
Cell color based on Status in HTML output maddelav Shell Programming and Scripting 1 02-12-2018 08:58 AM
Best way to increment weeks based on fiscal start year SIMMS7400 UNIX for Beginners Questions & Answers 31 11-02-2017 07:34 PM
Help with awk color codes based on condition venkitesh Shell Programming and Scripting 6 01-03-2017 07:09 AM
To check the missing file based on sequence number. Arun1992 Shell Programming and Scripting 5 04-22-2016 04:31 PM
Finding latest dir based on it's name (yyyymmdd) DOWD_R UNIX for Dummies Questions & Answers 5 09-28-2012 06:55 PM
Color line based on first field fnj00 Shell Programming and Scripting 2 10-03-2011 08:34 AM
How to pick only the latest files based on the timestamp? win4luv UNIX for Dummies Questions & Answers 43 06-29-2011 02:30 AM
Link based Active Active IPMP Mack1982 Solaris 2 12-01-2010 03:36 AM
grep latest file based on date. lweegp Shell Programming and Scripting 12 04-03-2009 04:10 AM