get_results($wpdb->prepare(
"SELECT id, account_id, msg, submit_date FROM %i
WHERE conversation_id = %d AND (msg_type IS NULL OR msg_type NOT IN ('note', 'system'))
ORDER BY id ASC",
$wpdb->rapidchat_messages,
$conversation_id
));
$visitor = (int) $wpdb->get_var($wpdb->prepare('SELECT account_sender_id FROM %i WHERE id = %d', $wpdb->rapidchat_conversations, $conversation_id));
$names = rapidchat_names_for_visitor(rapidchat_account_names(wp_list_pluck($messages, 'account_id')), $visitor);
$site_name = get_bloginfo('name');
/* translators: %s: site name. */
$html = '
' . sprintf(esc_html__('Chat transcript with %s', 'rapidchat'), esc_html($site_name)) . '
';
foreach ($messages as $m) {
$author = isset($names[$m->account_id]) ? $names[$m->account_id]->full_name : __('User', 'rapidchat');
$html .= '' . esc_html($author) . ' ('
. esc_html($m->submit_date) . '):
'
. make_clickable(nl2br(esc_html($m->msg))) . '
';
}
return $html;
}
/** Email a conversation transcript. */
function rapidchat_conversation_transcript(array $args) {
global $wpdb;
$conversation_id = isset($args['conversation_id']) ? (int) $args['conversation_id'] : 0;
$actor = isset($args['actor']) && is_array($args['actor']) ? $args['actor'] : array();
$actor_id = isset($actor['id']) ? (int) $actor['id'] : 0;
$is_operator = !empty($args['is_operator']);
$recipient = ($args['recipient'] ?? 'self') === 'visitor' ? 'visitor' : 'self';
if ($conversation_id <= 0 || $actor_id <= 0) {
return new WP_Error('rapidchat_invalid_request', __('Invalid request.', 'rapidchat'), array('status' => 400));
}
$allowed = $is_operator
? rapidchat_operator_can('manage', $conversation_id, $actor)
: rapidchat_can_access_conversation($actor_id, $conversation_id);
if (!$allowed) {
return new WP_Error('rapidchat_forbidden', __('Access denied.', 'rapidchat'), array('status' => 403));
}
// Visitors choose their own email address, so cap how often the site will mail on their behalf.
if (!$is_operator && (!rapidchat_rate_limit('transcript_' . $actor_id, 3, HOUR_IN_SECONDS) || !rapidchat_rate_limit('transcript_ip_' . rapidchat_client_ip(), 10, HOUR_IN_SECONDS))) {
return new WP_Error(
'rapidchat_rate_limited',
__('Too many transcript requests. Please try again later.', 'rapidchat'),
array('status' => 429)
);
}
if ($recipient === 'visitor') {
$sender_id = (int) $wpdb->get_var($wpdb->prepare(
'SELECT account_sender_id FROM %i WHERE id = %d',
$wpdb->rapidchat_conversations,
$conversation_id
));
if (!$sender_id) {
return new WP_Error('rapidchat_not_found', __('Conversation not found.', 'rapidchat'), array('status' => 404));
}
$email = (string) $wpdb->get_var($wpdb->prepare(
'SELECT email FROM %i WHERE id = %d',
$wpdb->rapidchat_accounts,
$sender_id
));
$no_email_message = __('No valid email on file for this visitor.', 'rapidchat');
} else {
$email = isset($actor['email']) ? (string) $actor['email'] : '';
$no_email_message = __('No valid email on file.', 'rapidchat');
}
if (!is_email($email)) {
return new WP_Error('rapidchat_invalid_email', $no_email_message, array('status' => 400));
}
$site_name = get_bloginfo('name');
$sent = wp_mail(
$email,
/* translators: %s: site name. */
sprintf(__('[%s] Your Chat Transcript', 'rapidchat'), $site_name),
rapidchat_transcript_html($conversation_id),
array('Content-Type: text/html; charset=UTF-8')
);
rapidchat_event('transcript_sent', $conversation_id, $email, $recipient, (bool) $sent);
return array('sent_to' => $email);
}