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)); } $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_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_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/>'))); }
function cs_user_badge($handle) { if (qa_opt('badge_active')) { $userids = qa_handles_to_userids(array($handle)); $userid = $userids[$handle]; // displays small badge widget, suitable for meta $result = qa_db_read_all_values(qa_db_query_sub('SELECT badge_slug FROM ^userbadges WHERE user_id=#', $userid)); if (count($result) == 0) { return; } $badges = qa_get_badge_list(); foreach ($result as $slug) { $bcount[$badges[$slug]['type']] = isset($bcount[$badges[$slug]['type']]) ? $bcount[$badges[$slug]['type']] + 1 : 1; } $output = '<ul class="user-badge clearfix">'; for ($x = 2; $x >= 0; $x--) { if (!isset($bcount[$x])) { continue; } $count = $bcount[$x]; if ($count == 0) { continue; } $type = qa_get_badge_type($x); $types = $type['slug']; $typed = $type['name']; $output .= '<li class="badge-medal ' . $types . '"><i class="icon-badge" title="' . $count . ' ' . $typed . '"></i><span class="badge-pointer badge-' . $types . '-count" title="' . $count . ' ' . $typed . '"> ' . $count . '</span></li>'; } $output = substr($output, 0, -1); // lazy remove space $output .= '</ul>'; return $output; } }
function process_request($request) { $qa_content = qa_content_prepare(); $qa_content['title'] = qa_lang('badges/badge_list_title'); $badges = qa_get_badge_list(); $totalawarded = 0; $qa_content['custom'] = '<em>' . qa_lang('badges/badge_list_pre') . '</em><br />'; $qa_content['custom2'] = '<table cellspacing="20">'; $c = 2; $result = qa_db_read_all_assoc(qa_db_query_sub('SELECT user_id,badge_slug FROM ^userbadges')); $count = array(); foreach ($result as $r) { if (qa_opt('badge_' . $r['badge_slug'] . '_enabled') == '0') { continue; } if (isset($count[$r['badge_slug']][$r['user_id']])) { $count[$r['badge_slug']][$r['user_id']]++; } else { $count[$r['badge_slug']][$r['user_id']] = 1; } $totalawarded++; if (isset($count[$r['badge_slug']]['count'])) { $count[$r['badge_slug']]['count']++; } else { $count[$r['badge_slug']]['count'] = 1; } } foreach ($badges as $slug => $info) { if (qa_opt('badge_' . $slug . '_enabled') == '0') { continue; } $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'); $var = qa_opt('badge_' . $slug . '_var'); $desc = qa_badge_desc_replace($slug, $var, false); $type = qa_get_badge_type($info['type']); $types = $type['slug']; $typen = $type['name']; $qa_content['custom' . ++$c] = '<tr><td class="badge-entry"><div class="badge-entry-badge"><span class="badge-' . $types . '" title="' . $typen . '">' . $name . '</span> <span class="badge-entry-desc">' . $desc . '</span>' . (isset($count[$slug]) ? ' <span title="' . $count[$slug]['count'] . ' ' . qa_lang('badges/awarded') . '" class="badge-count-link" onclick="jQuery(\'#badge-users-' . $slug . '\').slideToggle()">x' . $count[$slug]['count'] . '</span>' : '') . '</div>'; // source users if (qa_opt('badge_show_source_users') && isset($count[$slug])) { $users = array(); require_once QA_INCLUDE_DIR . 'qa-app-users.php'; $qa_content['custom' . $c] .= '<div style="display:none" id="badge-users-' . $slug . '" class="badge-users">'; foreach ($count[$slug] as $uid => $ucount) { if ($uid == 'count') { continue; } if (QA_FINAL_EXTERNAL_USERS) { $handles = qa_get_public_from_userids(array($uid)); $handle = @$handles[$uid]; } else { $useraccount = qa_db_select_with_pending(qa_db_user_account_selectspec($uid, true)); $handle = @$useraccount['handle']; } if (!$handle) { continue; } $users[] = '<a href="' . qa_path_html('user/' . $handle) . '">' . $handle . ($ucount > 1 ? ' x' . $ucount : '') . '</a>'; } $qa_content['custom' . $c] .= implode('<br/>', $users) . '</div>'; } $qa_content['custom' . $c] .= '</td></tr>'; } $qa_content['custom' . ++$c] = '<tr><td class="badge-entry"><span class="total-badges">' . count($badges) . ' ' . qa_lang('badges/badges_total') . '</span>' . ($totalawarded > 0 ? ', <span class="total-badge-count">' . $totalawarded . ' ' . qa_lang('badges/awarded_total') . '</span>' : '') . '</td></tr></table>'; if (isset($qa_content['navigation']['main']['custom-2'])) { $qa_content['navigation']['main']['custom-2']['selected'] = true; } return $qa_content; }
function qa_badge_plugin_user_form($userid) { $handles = qa_userids_to_handles(array($userid)); $handle = $handles[$userid]; // displays badge list in user profile $result = qa_db_read_all_assoc(qa_db_query_sub('SELECT badge_slug as slug, object_id AS oid FROM ^userbadges WHERE user_id=#', $userid)); $fields = array(); if (count($result) > 0) { // count badges $bin = qa_get_badge_list(); $badges = array(); foreach ($result as $info) { $slug = $info['slug']; $type = $bin[$slug]['type']; if (isset($badges[$type][$slug])) { $badges[$type][$slug]['count']++; } else { $badges[$type][$slug]['count'] = 1; } if ($info['oid']) { $badges[$type][$slug]['oid'][] = $info['oid']; } } foreach ($badges as $type => $badge) { $typea = qa_get_badge_type($type); $types = $typea['slug']; $typed = $typea['name']; $output = ' <table> <tr> <td class="qa-form-wide-label"> <h3 class="badge-title" title="' . qa_lang('badges/' . $types . '_desc') . '">' . $typed . '</h3> </td> </tr>'; foreach ($badge as $slug => $info) { $badge_name = qa_lang('badges/' . $slug); if (!qa_opt('badge_' . $slug . '_name')) { qa_opt('badge_' . $slug . '_name', $badge_name); } $name = qa_opt('badge_' . $slug . '_name'); $count = $info['count']; if (qa_opt('badge_show_source_posts')) { $oids = @$info['oid']; } else { $oids = null; } $var = qa_opt('badge_' . $slug . '_var'); $desc = qa_badge_desc_replace($slug, $var, $name); // badge row $output .= ' <tr> <td class="badge-container"> <div class="badge-container-badge"> <span class="badge-' . $types . '" title="' . $desc . ' (' . $typed . ')">' . qa_html($name) . '</span> <span onclick="jQuery(\'.badge-container-sources-' . $slug . '\').slideToggle()" class="badge-count' . (is_array($oids) ? ' badge-count-link" title="' . qa_lang('badges/badge_count_click') : '') . '">x ' . $count . '</span> </div>'; // source row(s) if any if (is_array($oids)) { $output .= ' <div class="badge-container-sources-' . $slug . '" style="display:none">'; foreach ($oids as $oid) { $post = qa_db_select_with_pending(qa_db_full_post_selectspec(null, $oid)); $title = $post['title']; $anchor = ''; if ($post['parentid']) { $anchor = urlencode(qa_anchor($post['type'], $oid)); $oid = $post['parentid']; $title = qa_db_read_one_value(qa_db_query_sub('SELECT BINARY title as title FROM ^posts WHERE postid=#', $oid), true); } $length = 30; $text = qa_strlen($title) > $length ? qa_substr($title, 0, $length) . '...' : $title; $output .= ' <div class="badge-source"><a href="' . qa_path_html(qa_q_request($oid, $title), NULL, qa_opt('site_url')) . ($anchor ? '#' . $anchor : '') . '">' . qa_html($text) . '</a></div>'; } } $output .= ' </td> </tr>'; } $output .= ' </table>'; $outa[] = $output; } $fields[] = array('value' => '<table class="badge-user-tables"><tr><td class="badge-user-table">' . implode('</td><td class="badge-user-table">', $outa) . '</td></tr></table>', 'type' => 'static'); } $ok = null; $tags = null; $buttons = array(); if ((bool) qa_opt('badge_email_notify') && qa_get_logged_in_handle() == $handle) { // add badge notify checkbox if (qa_clicked('badge_email_notify_save')) { qa_opt('badge_email_notify_id_' . $userid, (bool) qa_post_text('badge_notify_email_me')); $ok = qa_lang('badges/badge_notified_email_me'); } $select = (bool) qa_opt('badge_email_notify_id_' . $userid); $tags = 'id="badge-form" action="' . qa_self_html() . '#signature_text" method="POST"'; $fields[] = array('type' => 'blank'); $fields[] = array('label' => qa_lang('badges/badge_notify_email_me'), 'type' => 'checkbox', 'tags' => 'NAME="badge_notify_email_me"', 'value' => $select); $buttons[] = array('label' => qa_lang_html('main/save_button'), 'tags' => 'NAME="badge_email_notify_save"'); } return array('ok' => $ok && !isset($error) ? $ok : null, 'style' => 'tall', 'tags' => $tags, 'title' => qa_lang('badges/badges'), 'fields' => $fields, 'buttons' => $buttons); }
function ra_user_badges_list($userid) { if (!qa_opt('badge_active')) { return; } $handles = qa_userids_to_handles(array($userid)); $handle = $handles[$userid]; // displays badge list in user profile $result = qa_db_read_all_assoc(qa_db_query_sub('SELECT badge_slug as slug, object_id AS oid FROM ^userbadges WHERE user_id=#', $userid)); if (count($result) > 0) { // count badges $bin = qa_get_badge_list(); $badges = array(); foreach ($result as $info) { $slug = $info['slug']; $type = $bin[$slug]['type']; if (isset($badges[$type][$slug])) { $badges[$type][$slug]['count']++; } else { $badges[$type][$slug]['count'] = 1; } if ($info['oid']) { $badges[$type][$slug]['oid'][] = $info['oid']; } } foreach ($badges as $type => $badge) { $typea = qa_get_badge_type($type); $types = $typea['slug']; $typed = $typea['name']; $output = ''; //$output = '<h3 class="badge-title" title="'.qa_lang('badges/'.$types.'_desc').'">'.$typed.'</h3>'; foreach ($badge 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'); $count = $info['count']; if (qa_opt('badge_show_source_posts')) { $oids = @$info['oid']; } else { $oids = null; } $var = qa_opt('badge_' . $slug . '_var'); $desc = qa_badge_desc_replace($slug, $var, false); // badge row $output .= '<div class="badge-container-badge"> <span class="user-badge ' . $types . ' icon-badge" title="' . $desc . ' (' . $typed . ')">' . qa_html($name) . '</span> <span class="badge-count">x ' . $count . '</span>' . (is_array($oids) ? '<i class="icon-chevron-down"></i>' : ''); // source row(s) if any if (is_array($oids)) { $output .= ' <div class="badge-sources ' . $slug . '"><ul>'; foreach ($oids as $oid) { $post = qa_db_select_with_pending(qa_db_full_post_selectspec(null, $oid)); $title = $post['title']; $anchor = ''; if ($post['parentid']) { $anchor = urlencode(qa_anchor($post['type'], $oid)); $oid = $post['parentid']; $title = qa_db_read_one_value(qa_db_query_sub('SELECT BINARY title as title FROM ^posts WHERE postid=#', $oid), true); } //$length = 30; $text = $title; $output .= '<li><a href="' . qa_path_html(qa_q_request($oid, $title), NULL, qa_opt('site_url')) . ($anchor ? '#' . $anchor : '') . '">' . qa_html($text) . '</a></li>'; } $output .= '</ul></div>'; } $output .= '</div>'; } $outa[] = $output; } $fields = '<div class="badge-user-block widget"><h3 class="widget-title">' . _ra_lang('Badges') . '</h3><div class="widget-inner">' . implode('', $outa) . '</div></div>'; } return $fields; }