function template_webslice_recent_posts() { global $context, $scripturl, $txt; echo ' <div style="width: 100%; height: 100%; border: 1px solid black; padding: 0; margin: 0 0 0 0; font: 100.01%/100% Verdana, Helvetica, sans-serif;"> <div style="background-color: #080436; color: #ffffff; padding: 4px;"> ', cleanXml($txt['recent_posts']), ' </div>'; $alternate = 0; foreach ($context['recent_posts_data'] as $item) { echo ' <div style="background-color: ', $alternate ? '#ECEDF3' : '#F6F6F6', '; font-size: 90%; padding: 2px;"> <strong><a href="', $item['link'], '">', cleanXml($item['subject']), '</a></strong> ', cleanXml($txt['by']), ' ', cleanXml(!empty($item['poster']['link']) ? '<a href="' . $item['poster']['link'] . '">' . $item['poster']['name'] . '</a>' : $item['poster']['name']), ' </div>'; $alternate = !$alternate; } echo ' </div> <div style="width: 100%; height: 100%; border: 0; padding: 0; margin: 0 0 0 0; font: 100.01%/100% Verdana, Helvetica, sans-serif;"> <div style="font-size: xx-small;" class="righttext">'; if ($context['user']['is_guest']) { echo ' <a href="', $scripturl, '?action=login">', $txt['login'], '</a>'; } else { echo ' ', cleanXml($context['user']['name']), ', ', cleanXml($txt['msg_alert_you_have']), ' <a href="', $scripturl, '?action=pm">', cleanXml($context['user']['messages']), ' ', cleanXml($context['user']['messages'] != 1 ? $txt['msg_alert_messages'] : $txt['message_lowercase']), '</a>', cleanXml($txt['newmessages4'] . ' ' . $context['user']['unread_messages']), ' ', cleanXml($context['user']['unread_messages'] == 1 ? $txt['newmessages0'] : $txt['newmessages1']); } echo ' </div> </div>'; }
/** * @covers MarkupTranslator\Translators\Github::translate * @dataProvider translateProvider */ public function testTranslate($text, $expected) { $translator = new Github(); $this->assertEquals($expected, cleanXml($translator->translate($text))); }
/** * Provide the list of possible notification recipients. * * @since 2.0 */ function shd_ajax_notify() { global $txt, $context, $smcFunc, $user_profile, $modSettings, $sourcedir; $session_check = checkSession('get', '', false); // check the session but don't die fatally. if (!empty($session_check)) { return $context['ajax_return'] = array('error' => $txt[$session_check]); } shd_load_language('sd_language/SimpleDeskNotifications'); require_once $sourcedir . '/sd_source/SimpleDesk-Notifications.php'; if (!empty($context['ticket_id'])) { $query = shd_db_query('', ' SELECT hdt.private, hdt.id_member_started, id_member_assigned, id_dept, status FROM {db_prefix}helpdesk_tickets AS hdt WHERE {query_see_ticket} AND hdt.id_ticket = {int:ticket}', array('ticket' => $context['ticket_id'])); if ($smcFunc['db_num_rows']($query) != 0) { $ticket = $smcFunc['db_fetch_assoc']($query); } $smcFunc['db_free_result']($query); } if (empty($ticket) || !shd_allowed_to('shd_singleton_email', $ticket['id_dept']) || $ticket['status'] == TICKET_STATUS_CLOSED || $ticket['status'] == TICKET_STATUS_DELETED) { return $context['ajax_return'] = array('error' => $txt['shd_no_ticket']); } // So, we need to start figuring out who's going to be notified, who won't be and who we might be interested in notifying. $notify_list = array('being_notified' => array(), 'optional' => array(), 'optional_butoff' => array()); // Let's get all the possible actual people. The possible people who can be notified... well, they're staff. $staff = shd_get_visible_list($ticket['id_dept'], $ticket['private'], $ticket['id_member_started'], empty($modSettings['shd_admins_not_assignable']), false); // Let's start figuring it out then! First, get the big ol' lists. $query = $smcFunc['db_query']('', ' SELECT id_member, notify_state FROM {db_prefix}helpdesk_notify_override WHERE id_ticket = {int:ticket}', array('ticket' => $context['ticket_id'])); while ($row = $smcFunc['db_fetch_assoc']($query)) { $notify_list[$row['notify_state'] == NOTIFY_NEVER ? 'optional_butoff' : 'being_notified'][$row['id_member']] = true; } // Did we exclude admins? If we did, we would have scooped the list of admins. If they're in the 'not being notified but you can...' list, remove them. if (!empty($context['list_admin_exclude'])) { foreach ($context['list_admin_exclude'] as $user_id) { if (isset($notify_list['optional_butoff'][$user_id])) { unset($notify_list['optional_butoff'][$user_id]); } } } // Now we get the list by preferences. This is where it starts to get complicated. $possible_members = array(); // People who want replies to their own ticket, without including the ticket starter because they'd know about it... if (!empty($modSettings['shd_notify_new_reply_own']) && $context['user']['id'] != $ticket['id_member_started']) { $possible_members[$ticket['id_member_started']]['new_reply_own'] = true; } // The ticket is assigned to someone and they want to be notified if it changes. if (!empty($modSettings['shd_notify_new_reply_assigned']) && !empty($ticket['id_member_assigned']) && $context['user']['id'] != $ticket['id_member_assigned']) { $possible_members[$ticket['id_member_assigned']]['new_reply_assigned'] = true; } // So, if you're staff, and you've replied to this ticket before, do you want to be notified this time? if (!empty($modSettings['shd_notify_new_reply_previous'])) { $query = $smcFunc['db_query']('', ' SELECT id_member FROM {db_prefix}helpdesk_ticket_replies WHERE id_ticket = {int:ticket} GROUP BY id_member', array('ticket' => $context['ticket_id'])); $responders = array(); while ($row = $smcFunc['db_fetch_row']($query)) { $responders[] = $row[0]; } // this shouldn't be nil, ever, because we're replying, so the topic already exists so there's at least one name in there... $smcFunc['db_free_result']($query); $responders = array_intersect($responders, $staff); foreach ($responders as $id) { $possible_members[$id]['new_reply_previous'] = true; } } // If you're staff, did you have 'spam my inbox every single time' selected? if (!empty($modSettings['shd_notify_new_reply_any'])) { foreach ($staff as $id) { $possible_members[$id]['new_reply_any'] = true; } } // Now we have the list of possibles, exclude everyone who is either set to on, or off, since we don't need to query those for preferences. foreach ($possible_members as $id => $type_list) { if (isset($notify_list['being_notified'][$id]) || isset($notify_list['optional_butoff'][$id])) { unset($possible_members[$id]); } } if (!empty($possible_members)) { // Get the default preferences $prefs = shd_load_user_prefs(false); $pref_groups = $prefs['groups']; $base_prefs = $prefs['prefs']; // Build a list of users -> default prefs. We know this is for the list of possible contenders only. $member_prefs = array(); $pref_list = array(); foreach ($possible_members as $id => $type_list) { foreach ($type_list as $type => $value) { $member_prefs[$id][$type] = $base_prefs['notify_' . $type]['default']; $pref_list['notify_' . $type] = true; } } // Grab pref list from DB for these users and update $query = $smcFunc['db_query']('', ' SELECT id_member, variable, value FROM {db_prefix}helpdesk_preferences WHERE id_member IN ({array_int:members}) AND variable IN ({array_string:variables})', array('members' => array_keys($possible_members), 'variables' => array_keys($pref_list))); while ($row = $smcFunc['db_fetch_assoc']($query)) { $row['id_member'] = (int) $row['id_member']; $variable = substr($row['variable'], 7); if (isset($member_prefs[$row['id_member']][$variable])) { $member_prefs[$row['id_member']][$variable] = $row['value']; } } $smcFunc['db_free_result']($query); // unset $members where member pref doesn't indicate they want it on. foreach ($member_prefs as $id => $value) { foreach ($value as $pref_id => $pref_item) { if (empty($pref_item)) { unset($possible_members[$id][$pref_id]); } } } // Now, it's possible that we have a ticket that the starter can't see, but that their preferences would indicate they'd like a reply. // What should be done here is to remove them from the automatic list, and make them part of the ping list instead. if (!empty($ticket['id_member_started']) && !in_array($ticket['id_member_started'], $staff)) { $possible_members[$ticket['id_member_started']] = array(); } // Now the clever bit, we've taken everyone who wasn't on the normal notify list, and figured out what their preferences are. // We now traverse $possible_members by id, if the array is empty, we know none of their preferences accounted for emails - so they're possible. // Otherwise we add them to the list of being notified. foreach ($possible_members as $id => $list) { if (empty($list)) { $notify_list['optional'][$id] = true; } else { $notify_list['being_notified'][$id] = true; } } } // By now we have three lists that include people who will be notified, people who could be notified, and people who don't really want to be. // Let's translate that into a list of people that we can make use of. $members = array_merge(array_keys($notify_list['being_notified']), array_keys($notify_list['optional']), array_keys($notify_list['optional_butoff'])); if (!empty($members)) { // Get everyone's name. $loaded = loadMemberData($members); foreach ($loaded as $user) { if (!empty($user_profile[$user]) && $user_profile[$user]['is_activated'] > 0 && $user_profile[$user]['is_activated'] < 10) { // active & not banned $people[$user] = array('id' => $user, 'name' => $user_profile[$user]['real_name']); } } // Right, now let's step through and tidy up the three lists foreach ($notify_list as $list_type => $list_members) { foreach ($list_members as $id_member => $data) { if (isset($people[$id_member]) && $id_member != $context['user']['id']) { // We really shouldn't be in this list. $list_members[$id_member] = $people[$id_member]['name']; } else { unset($list_members[$id_member]); } } if (!empty($list_members)) { asort($list_members); array_walk($list_members, 'shd_format_notify_name', $ticket['id_member_started']); $notify_list[$list_type] = $list_members; } else { unset($notify_list[$list_type]); } } } if (empty($notify_list) || empty($members)) { return $context['ajax_raw'] = '<notify><![C' . 'DATA[' . cleanXml($txt['shd_ping_none']) . ']' . ']></notify>'; } else { ob_start(); echo '<notify><![C', 'DATA['; $selected = array(); if (!empty($_GET['list'])) { $_GET['list'] = explode(',', $_GET['list']); foreach ($_GET['list'] as $id) { if ((int) $id > 0) { $selected[] = (int) $id; } } } if (!empty($notify_list['being_notified'])) { echo '<span class="shd_ajax_head">', $txt['shd_ping_already_' . (count($notify_list['being_notified']) == 1 ? '1' : 'n')], '</span><br />', implode(', ', $notify_list['being_notified']); } if (!empty($notify_list['optional'])) { if (!empty($notify_list['being_notified'])) { echo '<br /><br />'; } echo '<span class="shd_ajax_head">', $txt['shd_ping_' . (count($notify_list['optional']) == 1 ? '1' : 'n')], '</span><br />'; foreach ($notify_list['optional'] as $id => $member) { echo '<div class="shd_ajaxnotify"><input type="checkbox" name="notify[', $id, ']" value="', $id, '"', in_array($id, $selected) ? ' checked="checked"' : '', ' class="input_check" /> ', $member, '</div>'; } } if (!empty($notify_list['optional_butoff'])) { if (!empty($notify_list['being_notified']) || !empty($notify_list['optional_butoff'])) { echo '<br /><br />'; } echo '<span class="shd_ajax_head">', $txt['shd_ping_none_' . (count($notify_list['optional_butoff']) == 1 ? '1' : 'n')], '</span><br />'; foreach ($notify_list['optional_butoff'] as $id => $member) { echo '<div class="shd_ajaxnotify"><input type="checkbox" name="notify[', $id, ']" value="', $id, '"', in_array($id, $selected) ? ' checked="checked"' : '', ' class="input_check" /> ', $member, '</div>'; } } echo ']', ']></notify>'; $content = ob_get_clean(); return $context['ajax_raw'] = cleanXml($content); } }
/** * This shows a webslice of the recent posts. */ function template_webslice_recent_posts() { global $context, $scripturl, $txt; // @todo test if this works echo ' <div style="width: 100%; height: 100%; border: 1px solid black; padding: 0; margin: 0 0 0 0; font: 100.01%/100% Verdana, Helvetica, sans-serif;"> <div style="background: #080436; color: #ffffff; padding: 4px;"> ', cleanXml($txt['recent_posts']), ' </div>'; // Recent posts bit $alternate = 0; foreach ($context['recent_posts_data'] as $item) { echo ' <div style="background: ', $alternate ? '#ECEDF3' : '#F6F6F6', '; font-size: 90%; padding: 2px;"> <strong><a href="', $item['link'], '">', cleanXml($item['subject']), '</a></strong> ', cleanXml($txt['by']), ' ', cleanXml(!empty($item['poster']['link']) ? '<a href="' . $item['poster']['link'] . '">' . $item['poster']['name'] . '</a>' : $item['poster']['name']), ' </div>'; $alternate = !$alternate; } echo ' </div> <div style="width: 100%; height: 100%; border: 0; padding: 0; margin: 0 0 0 0; font: 100.01%/100% Verdana, Helvetica, sans-serif;"> <div style="font-size: xx-small;" class="righttext">'; // Send alerts for the logged in user if they have new PMs if ($context['user']['is_guest']) { echo ' <a href="', $scripturl, '?action=login">', $txt['login'], '</a>'; } else { echo ' ', cleanXml($context['user']['name']), cleanXml(!empty($context['can_pm_read']) ? ', ' . (empty($context['user']['messages']) ? $txt['msg_alert_no_messages'] : ($context['user']['messages'] == 1 ? sprintf($txt['msg_alert_one_message'], $scripturl . '?action=pm') : sprintf($txt['msg_alert_many_message'], $scripturl . '?action=pm', $context['user']['messages'])) . ', ' . ($context['user']['unread_messages'] == 1 ? $txt['msg_alert_one_new'] : sprintf($txt['msg_alert_many_new'], $context['user']['unread_messages']))) : ''); } echo ' </div> </div>'; }