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


Login or Register to Reply

 
Thread Tools Search this Thread
# 1  
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  
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:
# 3  
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  
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  
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  
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  
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.
Login or Register to Reply

|
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
Hey, Upgrade (step 1) the posts, by putting a "user info" icon in the top right and making it so it toggles the user info. The user info icon has a badge which shows the number of posts. I will have to dig around in the code more to get the total posts thanks and other badges working; but...... What is on Your Mind?
22
What is on Your Mind?
Best way to increment weeks based on fiscal start year
SIMMS7400
Hi Folks - I'm looking for the best way to to increment fiscal weeks - allow me to explain. At my one client, 10/01/17 was the beginning if year fiscal year 2018. Each week, I need to manage a unique set of variable that are updated in my application - they are called substitution variables....... UNIX for Beginners Questions & Answers
31
UNIX for Beginners Questions & Answers
Link based Active Active IPMP
Mack1982
Hi, I need to configure 4 ip address (same subnet and mask) in one ipmp group (two interfaces) in an active active formation (link based). Can some one provide the steps or a tutorial link. Thanks... Solaris
2
Solaris