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


 
Thread Tools Search this Thread
Top Forums Web Development Color a Badge Based on the Weeks the Member is Active in the Latest Sequence
# 1  
Old 01-09-2019
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 01-09-2019
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  
Old 01-09-2019
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 01-10-2019
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 01-15-2019
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 01-15-2019
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 01-15-2019
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 Ask a Question

Previous Thread | Next Thread

5 More Discussions You Might Find Interesting

1. What is on Your Mind?

Update to Posts - Member Info Icon and Badge

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... (22 Replies)
Discussion started by: Neo
22 Replies

2. UNIX for Beginners Questions & Answers

Best way to increment weeks based on fiscal start year

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.... (31 Replies)
Discussion started by: SIMMS7400
31 Replies

3. Shell Programming and Scripting

Help with awk color codes based on condition

HI i have two files say test and test1 Test.txt Code: Lun01 2TB 1.99TB 99.6% Lun02 2TB 1.99TB 99.5% Lun03 2TB 1.99TB 99.5% Lun04 2TB 1.55TB 89.6% Code: Test1.txt Lun01 2TB 1.99TB 89.5% Lun02 2TB 1.99TB 99.5% Lun03 2TB 1.99TB 99.5% Requirement is to compare... (6 Replies)
Discussion started by: venkitesh
6 Replies

4. Shell Programming and Scripting

Color line based on first field

Hello, I have a bash script that outputs the following text to a file and then prints that file to the screen: |64 |30 |0 |8 |23:59:14 |38 |57 |2 |14 |00:09:05 |29 |50 |4 |20 |23:58:04 |20 |48 |7 |23 |00:05:44 |18 ... (2 Replies)
Discussion started by: fnj00
2 Replies

5. Solaris

Link based Active Active IPMP

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 (2 Replies)
Discussion started by: Mack1982
2 Replies
Login or Register to Ask a Question