<?php class qa_badge_admin { function allow_template($template) { return ($template!='admin'); } function option_default($option) { if(strpos($option,'badge_email_notify_id_') === 0) { return (qa_opt('badge_email_notify_on')?true:false); } $badges = qa_get_badge_list(); $slug = preg_replace('/badge_(.+)_[^_]+/',"$1",$option); switch($option) { case 'badge_'.$slug.'_name': //return qa_badge_name('badges/'.$slug); return qa_lang('badges/'.$slug); case 'badge_'.$slug.'_var': return @$badges[$slug]['var']; case 'badge_'.$slug.'_enabled': return '0'; case 'badge_custom_badges': return true; case 'badge_notify_time': return 0; case 'badge_widget_list_max': return 5; case 'badge_widget_date_max': return 30; case 'badge_email_subject': return '[^site_title] '; case 'badge_email_body': return 'Congratulations! You have earned a "^badge_name" badge from ^site_title ^if_post_text="for the following post: ^post_title ^post_url" Please log in and visit your profile: ^profile_url You may cancel these notices at any time by visiting your profile at the link above.'; case 'badges_css': return '.notify-container { left: 0; right: 0; top: 0; padding: 0; position: fixed; width: 100%; z-index: 10000; } .badge-container-badge { white-space: nowrap; } .badge-notify { background-color: #F6DF30; color: #444444; font-weight: bold; width: 100%; text-align: center; font-family: sans-serif; font-size: 14px; padding: 10px 0; position:relative; } .notify-close { color: #735005; cursor: pointer; font-size: 18px; line-height: 18px; padding: 0 3px; position: absolute; right: 8px; text-decoration: none; top: 8px; } #badge-form td { vertical-align:top; } .badge-bronze,.badge-silver, .badge-gold { margin-right:4px; color: #000; font-weight:bold; text-align:center; border-radius:4px; width:120px; padding: 5px 10px; display: inline-block; } .badge-bronze { background-color: #CB9114; background-image: -webkit-linear-gradient(left center , #CB9114, #EDB336, #CB9114, #A97002, #CB9114); background-image: -moz-linear-gradient(left center , #CB9114, #EDB336, #CB9114, #A97002, #CB9114); background-image: -ms-linear-gradient(left center , #CB9114, #EDB336, #CB9114, #A97002, #CB9114); background-image: -o-linear-gradient(left center , #CB9114, #EDB336, #CB9114, #A97002, #CB9114); background-image: linear-gradient(left center , #CB9114, #EDB336, #CB9114, #A97002, #CB9114); /* standard, but currently unimplemented */ border:2px solid #6C582C; } .badge-silver { background-color: #CDCDCD; background-image: -webkit-linear-gradient(left center , #CDCDCD, #EFEFEF, #CDCDCD, #ABABAB, #CDCDCD); background-image: -moz-linear-gradient(left center , #CDCDCD, #EFEFEF, #CDCDCD, #ABABAB, #CDCDCD); background-image: -ms-linear-gradient(left center , #CDCDCD, #EFEFEF, #CDCDCD, #ABABAB, #CDCDCD); background-image: -o-linear-gradient(left center , #CDCDCD, #EFEFEF, #CDCDCD, #ABABAB, #CDCDCD); background-image: linear-gradient(left center , #CDCDCD, #EFEFEF, #CDCDCD, #ABABAB, #CDCDCD); /* standard, but currently unimplemented */ border:2px solid #737373; } .badge-gold { background-color: #EEDD0F; background-image: -webkit-linear-gradient(left center , #EEDD0F, #FFFF2F, #EEDD0F, #CCBB0D, #EEDD0F); background-image: -moz-linear-gradient(left center , #EEDD0F, #FFFF2F, #EEDD0F, #CCBB0D, #EEDD0F); background-image: -ms-linear-gradient(left center , #EEDD0F, #FFFF2F, #EEDD0F, #CCBB0D, #EEDD0F); background-image: -o-linear-gradient(left center , #EEDD0F, #FFFF2F, #EEDD0F, #CCBB0D, #EEDD0F); background-image: linear-gradient(left center , #EEDD0F, #FFFF2F, #EEDD0F, #CCBB0D, #EEDD0F); /* standard, but currently unimplemented */ border:2px solid #7E7B2A; } .badge-bronze-medal, .badge-silver-medal, .badge-gold-medal { font-size: 14px; font-family:sans-serif; } .badge-bronze-medal { color: #CB9114; } .badge-silver-medal { color: #CDCDCD; } .badge-gold-medal { color: #EEDD0F; } .badge-pointer { cursor:pointer; } .badge-desc { padding-left:8px; } .badge-count { font-weight:bold; } .badge-count-link { cursor:pointer; color:#992828; } .badge-source { text-align:center; padding:0; } .badge-widget-entry { white-space:nowrap; } '; default: return null; } } function admin_form(&$qa_content) { // Process form input $ok = null; $badges = qa_get_badge_list(); if (qa_clicked('badge_award_button')) { if((bool)qa_post_text('badge_award_delete')) { qa_db_query_sub( 'DROP TABLE IF EXISTS ^userbadges' ); qa_db_query_sub( 'CREATE TABLE ^userbadges ('. 'awarded_at DATETIME NOT NULL,'. 'user_id INT(11) NOT NULL,'. 'notify TINYINT DEFAULT 0 NOT NULL,'. 'object_id INT(10),'. 'badge_slug VARCHAR (64) CHARACTER SET ascii DEFAULT \'\','. 'id INT(11) NOT NULL AUTO_INCREMENT,'. 'PRIMARY KEY (id)'. ') ENGINE=MyISAM DEFAULT CHARSET=utf8' ); } $ok = $this->qa_check_all_users_badges(); } else if (qa_clicked('badge_reset_names')) { foreach ($badges as $slug => $info) { qa_opt('badge_'.$slug.'_name',qa_badge_name($slug,true)); } $ok = qa_lang('badges/badge_names_reset'); } else if (qa_clicked('badge_reset_values')) { foreach ($badges as $slug => $info) { if(isset($info['var'])) { qa_opt('badge_'.$slug.'_var',$info['var']); } } $ok = qa_lang('badges/badge_values_reset'); } else if (qa_clicked('badge_trigger_notify')) { $qa_content['test-notify'] = 1; } else if (qa_clicked('badge_reset_css')) { qa_opt('badges_css', $this->option_default('badges_css')); $ok = 'CSS Reset'; } else if(qa_clicked('badge_save_settings')) { qa_opt('badge_active', (bool)qa_post_text('badge_active_check')); if (qa_opt('badge_active')) { qa_db_query_sub( 'CREATE TABLE IF NOT EXISTS ^userbadges ('. 'awarded_at DATETIME NOT NULL,'. 'user_id INT(11) NOT NULL,'. 'notify TINYINT DEFAULT 0 NOT NULL,'. 'object_id INT(10),'. 'badge_slug VARCHAR (64) CHARACTER SET ascii DEFAULT \'\','. 'id INT(11) NOT NULL AUTO_INCREMENT,'. 'PRIMARY KEY (id)'. ') ENGINE=MyISAM DEFAULT CHARSET=utf8' ); qa_db_query_sub( 'CREATE TABLE IF NOT EXISTS ^achievements ('. 'user_id INT(11) UNIQUE NOT NULL,'. 'first_visit DATETIME,'. 'oldest_consec_visit DATETIME,'. 'longest_consec_visit INT(10),'. 'last_visit DATETIME,'. 'total_days_visited INT(10),'. 'questions_read INT(10),'. 'posts_edited INT(10)'. ') ENGINE=MyISAM DEFAULT CHARSET=utf8' ); // set badge names, vars and states foreach ($badges as $slug => $info) { // update var if(isset($info['var']) && qa_post_text('badge_'.$slug.'_var')) { qa_opt('badge_'.$slug.'_var',qa_post_text('badge_'.$slug.'_var')); } // toggle activation if((bool)qa_post_text('badge_'.$slug.'_enabled') === false) { qa_opt('badge_'.$slug.'_enabled','0'); } else qa_opt('badge_'.$slug.'_enabled','1'); // set custom names if (qa_post_text('badge_'.$slug.'_edit') != qa_opt('badge_'.$slug.'_name')) { qa_opt('badge_'.$slug.'_name',qa_post_text('badge_'.$slug.'_edit')); $qa_lang_default['badges'][$slug] = qa_opt('badge_'.$slug.'_name'); } } // options qa_opt('badge_notify_time', (int)qa_post_text('badge_notify_time')); qa_opt('badge_show_users_badges',(bool)qa_post_text('badge_show_users_badges')); qa_opt('badge_show_source_posts',(bool)qa_post_text('badge_show_source_posts')); qa_opt('badge_show_source_users',(bool)qa_post_text('badge_show_source_users')); qa_opt('badge_admin_user_widget',(bool)qa_post_text('badge_admin_user_widget')); qa_opt('badge_admin_loggedin_widget',(bool)qa_post_text('badge_admin_loggedin_widget')); qa_opt('badge_admin_user_widget_q_item',(bool)qa_post_text('badge_admin_user_widget_q_item')); qa_opt('badge_admin_user_field',(bool)qa_post_text('badge_admin_user_field')); qa_opt('badge_admin_user_field_no_tab',(bool)qa_post_text('badge_admin_user_field_no_tab')); qa_opt('badge_widget_date_max',(int)qa_post_text('badge_widget_date_max')); qa_opt('badge_widget_list_max',(int)qa_post_text('badge_widget_list_max')); qa_opt('badge_email_notify',(bool)qa_post_text('badge_email_notify')); qa_opt('badge_email_notify_on',(bool)qa_post_text('badge_email_notify_on')); qa_opt('badge_email_subject',qa_post_text('badge_email_subject')); qa_opt('badge_email_body',qa_post_text('badge_email_body')); qa_opt('badges_css',qa_post_text('badges_css')); } $ok = qa_lang('badges/badge_admin_saved'); } // Create the form for display $fields = array(); $fields[] = array( 'label' => qa_lang('badges/badge_admin_activate'), 'tags' => 'NAME="badge_active_check"', 'value' => qa_opt('badge_active'), 'type' => 'checkbox', ); if(qa_opt('badge_active')) { $fields[] = array( 'label' => qa_lang('badges/active_badges').':', 'type' => 'static', ); $fields[] = array( 'label' => qa_lang('badges/badge_admin_select_all'), 'tags' => 'onclick="var isx = this.checked; jQuery(\'.badge-listing :checkbox\').prop(\'checked\',isx);"', 'value' => false, 'type' => 'checkbox', ); foreach ($badges as $slug => $info) { $badge_name=qa_badge_name($slug); if(!qa_opt('badge_'.$slug.'_name')) qa_opt('badge_'.$slug.'_name',$badge_name); $name = qa_opt('badge_'.$slug.'_name'); $badge_desc=qa_badge_desc_replace($slug,qa_opt('badge_'.$slug.'_var'),true); $type = qa_get_badge_type($info['type']); $types = $type['slug']; $fields[] = array( 'type' => 'static', 'note' => '<table class="badge-listing"><tr><td><input type="checkbox" name="badge_'.$slug.'_enabled"'.(qa_opt('badge_'.$slug.'_enabled') !== '0' ? ' checked':'').'></td><td><input type="text" name="badge_'.$slug.'_edit" id="badge_'.$slug.'_edit" style="display:none" size="16" onblur="badgeEdit(\''.$slug.'\',true)" value="'.$name.'"><span id="badge_'.$slug.'_badge" class="badge-'.$types.'" onclick="badgeEdit(\''.$slug.'\')" title="'.qa_lang('badges/badge_admin_click_edit').'">'.$name.'</span></td><td>'.$badge_desc.'</td></tr></table>' ); } $fields[] = array( 'type' => 'blank', ); $fields[] = array( 'label' => qa_lang('badges/notify_time').':', 'type' => 'number', 'value' => qa_opt('badge_notify_time'), 'tags' => 'NAME="badge_notify_time"', 'note' => '<em>'.qa_lang('badges/notify_time_desc').'</em>', ); $fields[] = array( 'type' => 'blank', ); $fields[] = array( 'label' => qa_lang('badges/badge_admin_user_field'), 'tags' => 'NAME="badge_admin_user_field"', 'value' => (bool)qa_opt('badge_admin_user_field'), 'type' => 'checkbox', ); $fields[] = array( 'label' => qa_lang('badges/badge_admin_user_field_no_tab'), 'tags' => 'NAME="badge_admin_user_field_no_tab"', 'value' => (bool)qa_opt('badge_admin_user_field_no_tab'), 'type' => 'checkbox', ); $fields[] = array( 'type' => 'blank', ); $fields[] = array( 'label' => qa_lang('badges/badge_show_source_posts'), 'tags' => 'NAME="badge_show_source_posts"', 'value' => (bool)qa_opt('badge_show_source_posts'), 'type' => 'checkbox', ); $fields[] = array( 'label' => qa_lang('badges/badge_show_source_users'), 'tags' => 'NAME="badge_show_source_users"', 'value' => (bool)qa_opt('badge_show_source_users'), 'type' => 'checkbox', ); $fields[] = array( 'label' => qa_lang('badges/badge_admin_user_widget'), 'tags' => 'NAME="badge_admin_user_widget"', 'value' => (bool)qa_opt('badge_admin_user_widget'), 'type' => 'checkbox', ); $fields[] = array( 'label' => qa_lang('badges/badge_admin_user_widget_q_item'), 'tags' => 'NAME="badge_admin_user_widget_q_item"', 'value' => (bool)qa_opt('badge_admin_user_widget_q_item'), 'type' => 'checkbox', ); $fields[] = array( 'label' => qa_lang('badges/badge_admin_loggedin_widget'), 'tags' => 'NAME="badge_admin_loggedin_widget"', 'value' => (bool)qa_opt('badge_admin_loggedin_widget'), 'type' => 'checkbox', ); $fields[] = array( 'label' => qa_lang('badges/badge_show_users_badges'), 'tags' => 'NAME="badge_show_users_badges"', 'value' => (bool)qa_opt('badge_show_users_badges'), 'type' => 'checkbox', ); if (qa_clicked('badge_trigger_notify')) { $fields['test-notify'] = 1; } $fields[] = array( 'label' => 'Badge css stylesheet', 'tags' => 'NAME="badges_css"', 'value' => qa_opt('badges_css'), 'rows' => 20, 'type' => 'textarea', ); $fields[] = array( 'type' => 'blank', ); $fields[] = array( 'label' => qa_lang('badges/widget_list_max').':', 'type' => 'number', 'value' => qa_opt('badge_widget_list_max'), 'tags' => 'NAME="badge_widget_list_max"', ); $fields[] = array( 'label' => qa_lang('badges/widget_date_max').':', 'type' => 'number', 'value' => qa_opt('badge_widget_date_max'), 'tags' => 'NAME="badge_widget_date_max"', ); $fields[] = array( 'type' => 'blank', ); $fields[] = array( 'label' => qa_lang('badges/badge_email_notify'), 'tags' => 'NAME="badge_email_notify" onclick="if(this.checked) jQuery(\'#badge_email_container\').fadeIn(); else jQuery(\'#badge_email_container\').fadeOut();"', 'value' => (bool)qa_opt('badge_email_notify'), 'type' => 'checkbox', 'note' => '<table id="badge_email_container" style="display:'.(qa_opt('badge_email_notify')?'block':'none').'"><tr><td>', ); $fields[] = array( 'label' => qa_lang('badges/badge_email_notify_on'), 'tags' => 'NAME="badge_email_notify_on" id="badge_email_notify_on"', 'value' => (bool)qa_opt('badge_email_notify_on'), 'type' => 'checkbox', ); $fields[] = array( 'label' => qa_lang('badges/badge_email_subject'), 'tags' => 'NAME="badge_email_subject" id="badge_email_subject"', 'value' => qa_opt('badge_email_subject'), 'type' => 'text', ); $fields[] = array( 'label' => qa_lang('badges/badge_email_body'), 'tags' => 'name="badge_email_body" id="badge_email_body"', 'value' => qa_opt('badge_email_body'), 'type' => 'textarea', 'rows' => 20, 'note' => 'Available replacement text:<br/><br/><i>^site_title<br/>^handle<br/>^email<br/>^open<br/>^close<br/>^badge_name<br/>^post_title<br/>^post_url<br/>^profile_url<br/>^site_url<br/>^if_post_text="text"</i></td></tr></table>', ); $fields[] = array( 'type' => 'blank', ); } return array( 'ok' => ($ok && !isset($error)) ? $ok : null, 'fields' => $fields, 'buttons' => array( array( 'label' => qa_lang('badges/badge_trigger_notify'), 'tags' => 'name="badge_trigger_notify"'.(qa_opt('badge_active')?'':' disabled="true"'), 'note' => '<br/><em>'.qa_lang('badges/badge_trigger_notify_desc').'</em><br/>', ), array( 'label' => qa_lang('badges/badge_reset_names'), 'tags' => 'NAME="badge_reset_names"', 'note' => '<br/><em>'.qa_lang('badges/badge_reset_names_desc').'</em><br/>', ), array( 'label' => qa_lang('badges/badge_reset_css'), 'tags' => 'NAME="badge_reset_css"', ), array( 'label' => qa_lang('badges/badge_reset_values'), 'tags' => 'NAME="badge_reset_values"', 'note' => '<br/><em>'.qa_lang('badges/badge_reset_values_desc').'</em><br/>', ), array( 'label' => qa_lang('badges/badge_award_button'), 'tags' => 'NAME="badge_award_button"', 'note' => '<br/><em>'.qa_lang('badges/badge_award_button_desc').'</em><br/><input type="checkbox" name="badge_award_delete"><b>'.qa_lang('badges/badge_award_delete_desc').'</b><br/>', ), array( 'label' => qa_lang('badges/save_settings'), 'tags' => 'NAME="badge_save_settings"', 'note' => '<br/><em>'.qa_lang('badges/save_settings_desc').'</em><br/>', ), ), ); } // imported user badge checking functions function award_badge($object_id, $user_id, $badge_slug) { // add badge to userbadges qa_db_query_sub( 'INSERT INTO ^userbadges (awarded_at, notify, object_id, user_id, badge_slug, id) '. 'VALUES (NOW(), #, #, #, #, 0)', 0, $object_id, $user_id, $badge_slug ); } function get_post_data($id) { $result = qa_db_read_one_assoc( qa_db_query_sub( 'SELECT * FROM ^posts WHERE postid=#', $id ), true ); return $result; } // badge check function qa_check_all_users_badges() { $awarded = 0; $users; $temp = qa_db_query_sub( 'SELECT * FROM ^posts' ); while ( ($post=qa_db_read_one_assoc($temp,true)) !== null ) { if(!$post['userid']) continue; $user='user'.$post['userid']; $pid = $post['postid']; $pt = $post['type']; // get post count if(isset($users[$user]) && isset($users[$user][$pt])) $users[$user][$pt]++; else $users[$user][$pt] = 1; // get post votes if($post['netvotes'] !=0) $users[$user][$pt.'votes'][] = array( 'id'=>$pid, 'votes'=>(int)$post['netvotes'], 'parentid'=>$post['parentid'], 'created'=>$post['created'] ); // get post views if($post['views']) $users[$user]['views'][] = array( 'id'=>$pid, 'views'=>$post['views'] ); } //votes received and given out $voter = qa_db_read_all_assoc( qa_db_query_sub( 'SELECT userid,qupvotes,qdownvotes,aupvotes,adownvotes,upvoteds FROM ^userpoints' ) ); foreach ($voter as $idx => $votes) { $user='user'.$votes['userid']; // votes $users[$user]['votes'] = (int)$votes['qupvotes']+(int)$votes['qdownvotes']+(int)$votes['aupvotes']+(int)$votes['adownvotes']; // voteds $users[$user]['voted'] = (int)$votes['upvoteds']; unset($voter[$idx]); } // flags $flag_result = qa_db_read_all_values( qa_db_query_sub( 'SELECT userid FROM ^uservotes WHERE flag > 0' ) ); foreach ($flag_result as $idx => $flag) { $user='user'.$flag; // get flag count if(isset($users[$user]) && isset($users[$user]['flags'])) $users[$user]['flags']++; else $users[$user]['flags'] = 1; unset($flag_result[$idx]); } // per user loop foreach ($users as $user => $data) { $uid = (int)substr($user,4); // bulk posts $badges = array( 'Q' => array('asker','questioner','inquisitor'), 'A' => array('answerer','lecturer','preacher'), 'C' => array('commenter','commentator','annotator') ); foreach($badges as $pt => $slugs) { if(!isset($data[$pt])) continue; $awarded += count(qa_badge_award_check($slugs, $data[$pt], $uid, null, 0)); } // nice Q&A $badges = array('nice_question','good_question','great_question','nice_answer','good_answer','great_answer'); if($this->badge_activated($badges)) { $badges = array( 'Q' => array('nice_question','good_question','great_question'), 'A' => array('nice_answer','good_answer','great_answer') ); foreach($badges as $pt => $slugs) { foreach($slugs as $badge_slug) { if(!isset($data[$pt.'votes'])) continue; foreach($data[$pt.'votes'] as $idv) { // poll plugin integration if($pt == 'A' && qa_opt('poll_enable')) { $poll = qa_db_read_one_value( qa_db_query_sub( 'SELECT meta_value FROM ^postmeta WHERE post_id=# AND meta_key=$', $idv['id'], 'is_poll' ), true ); if($poll) continue; } if((int)$idv['votes'] >= (int)qa_opt('badge_'.$badge_slug.'_var') && qa_opt('badge_'.$badge_slug.'_enabled') !== '0') { $result = qa_db_read_one_value( qa_db_query_sub( 'SELECT badge_slug FROM ^userbadges WHERE user_id=# AND object_id=# AND badge_slug=$', $uid, $idv['id'], $badge_slug ), true ); if ($result == null) { // not already awarded this badge $this->award_badge($idv['id'], $uid, $badge_slug,false,true); $awarded++; } // old question answer vote checks if($pt == 'A') { $qid = $idv['parentid']; $create = strtotime($idv['created']); $parent = $this->get_post_data($qid); $pcreate = strtotime($parent['created']); $diff = round(abs($pcreate-$create)/60/60/24); $badge_slug2 = $badge_slug.'_old'; if($diff >= (int)qa_opt('badge_'.$badge_slug2.'_var') && qa_opt('badge_'.$badge_slug2.'_enabled') !== '0') { $result = qa_db_read_one_value( qa_db_query_sub( 'SELECT badge_slug FROM ^userbadges WHERE user_id=# AND object_id=# AND badge_slug=$', $uid, $idv['id'], $badge_slug2 ), true ); if ($result == null) { // not already awarded for this answer $this->award_badge($idv['id'], $uid, $badge_slug2); $awarded++; } } } } } } } } // votes per user badges if(isset($data['votes'])) { $votes = $data['votes']; $badges = array('voter','avid_voter','devoted_voter'); $awarded += count(qa_badge_award_check($badges, $votes, $uid, null, 0)); } // voted per user badges if(isset($data['voted'])) { $votes = $data['voted']; $badges = array('liked','loved','revered'); $awarded += count(qa_badge_award_check($badges, $votes, $uid, null, 0)); } // views per post badges if(isset($data['views'])) { $badges = array('notable_question','popular_question','famous_question'); foreach($data['views'] as $idv) { $awarded += count(qa_badge_award_check($badges, $idv['views'], $uid, $idv['id'], 0)); } } // flags per user if(isset($data['flags'])) { $flags = $data['flags']; $badges = array('watchdog','bloodhound','pitbull'); $awarded += count(qa_badge_award_check($badges, $flags, $uid, null, 0)); } unset($users[$user]); } // selects, selecteds $badges = array('gifted','wise','enlightened','grateful','respectful','reverential'); if($this->badge_activated($badges)) { $selects = qa_db_read_all_assoc( qa_db_query_sub( 'SELECT aselects, aselecteds, userid FROM ^userpoints' ) ); foreach($selects as $idx => $s) { $uid = $s['userid']; if(isset($s['aselecteds'])) { $count = $s['aselecteds']; $badges = array('gifted','wise','enlightened'); $awarded += count(qa_badge_award_check($badges, $count, $uid, null, 0)); } if(isset($s['aselects'])) { $count = $s['aselects']; $badges = array('grateful','respectful','reverential'); $awarded += count(qa_badge_award_check($badges, $count, $uid, null, 0)); } unset($selects[$idx]); } } // achievements $badges = array('dedicated','devoted','zealous','visitor','trouper','veteran','regular','old_timer','ancestor','reader','avid_reader','devoted_reader'); if($this->badge_activated($badges)) { $userq = qa_db_query_sub( 'SELECT user_id AS uid,questions_read AS qr,oldest_consec_visit AS ocv,longest_consec_visit AS lcv,total_days_visited AS tdv,last_visit AS lv,first_visit AS fv,posts_edited AS pe FROM ^achievements' ); while ( ($user=qa_db_read_one_assoc($userq,true)) !== null ) { $uid = $user['uid']; // edits $count = $user['pe']; $badges = array('editor','copy_editor','senior_editor'); $awarded += count(qa_badge_award_check($badges, $count, $uid, null, 0)); // on-sign-in badges // check lapse in days since last visit // using julian days $todayj = GregorianToJD(date('n'),date('j'),date('Y')); $last_visit = strtotime($user['lv']); $lastj = GregorianToJD(date('n',$last_visit),date('j',$last_visit),date('Y',$last_visit)); $last_diff = $todayj-$lastj; $first_visit = strtotime($user['fv']); $first_visitj = GregorianToJD(date('n',$first_visit),date('j',$first_visit),date('Y',$first_visit)); $first_visit_diff = $todayj-$first_visitj; $badges = array('dedicated','devoted','zealous'); $awarded += count(qa_badge_award_check($badges, $user['lcv'], $uid, null, 0)); $badges = array('visitor','trouper','veteran'); $awarded += count(qa_badge_award_check($badges, $user['tdv'], $uid, null, 0)); $badges = array('regular','old_timer','ancestor'); $awarded += count(qa_badge_award_check($badges, $first_visit_diff, $uid, null, 0)); // views $badges = array('reader','avid_reader','devoted_reader'); $awarded += count(qa_badge_award_check($badges, $user['qr'], $uid,null,0)); } } // points $badges = array('100_club','1000_club','10000_club'); if($this->badge_activated($badges)) { $userq = qa_db_query_sub('SELECT userid, points FROM ^userpoints'); while ( ($user=qa_db_read_one_assoc($userq,true)) !== null ) { $awarded += count(qa_badge_award_check($badges, $user['points'], $user['userid'], null, 0)); } } if(!QA_FINAL_EXTERNAL_USERS) { // verified $badges = array('verified'); if($this->badge_activated($badges)) { $userq = qa_db_query_sub('SELECT userid, flags FROM ^users WHERE flags&#', QA_USER_FLAGS_EMAIL_CONFIRMED); while ( ($user=qa_db_read_one_assoc($userq,true)) !== null ) { $awarded += count(qa_badge_award_check($badges, false, $user['userid'], null, 0)); } } // profile stuff $badges = array('avatar','profiler'); if($this->badge_activated($badges)) { $userq = qa_db_query_sub('SELECT userid FROM ^users'); while ( ($userid=qa_db_read_one_value($userq,true)) !== null ) { list($useraccount, $userprofile, $userfields)=qa_db_select_with_pending( qa_db_user_account_selectspec($userid, true), qa_db_user_profile_selectspec($userid, true), qa_db_userfields_selectspec() ); // avatar badge if (qa_opt('avatar_allow_upload') && isset($useraccount['avatarblobid'])) { $badges = array('avatar'); $awarded += count(qa_badge_award_check($badges, false, $userid, null, 0)); } // profile completion $missing = false; foreach ($userfields as $userfield) { if(!isset($userprofile[$userfield['title']]) || @$userprofile[$userfield['title']] === '') { $missing = true; break; } } if(!$missing) { $badges = array('profiler'); $awarded += count(qa_badge_award_check($badges, false, $userid, null, 0)); } } } } // rebuild badges from other plugins - experimental! - $module->custom_badges_rebuild() returns number of badges awarded. $moduletypes=qa_list_module_types(); foreach ($moduletypes as $moduletype) { $modulenames=qa_list_modules($moduletype); foreach ($modulenames as $modulename) { $module=qa_load_module($moduletype, $modulename); if (method_exists($module, 'custom_badges_rebuild')) { $awarded += $module->custom_badges_rebuild(); } } } // badges $badges = array('medalist','champion','olympian'); if($this->badge_activated($badges)) { $badgelist = qa_db_read_all_values( qa_db_query_sub( 'SELECT user_id FROM ^userbadges' ) ); $users = array(); foreach ($badgelist as $idx => $medal) { $user='user'.$medal; // get badge count if(isset($users[$user]) && isset($users[$user]['medals'])) $users[$user]['medals']++; else $users[$user]['medals'] = 1; unset($badgelist[$idx]); } foreach($users as $user => $data) { $uid = (int)substr($user,4); // check badges if(isset($data['medals'])) { $uid = (int)substr($user,4); $count = $data['medals']; $awarded += count(qa_badge_award_check($badges, $count, $uid, null, 0)); } unset($users[$user]); } } // return ok text return $awarded.' badge'.($awarded != 1 ? 's':'').' awarded.'; } function badge_activated($badges) { $c = 0; foreach($badges as $slug) { if(qa_opt('badge_'.$slug.'_enabled') !== '0') $c++; } return $c; } }