summaryrefslogtreecommitdiff
path: root/src/forum_post_send.php
diff options
context:
space:
mode:
authoruckelman <uckelman@nomic.net>2010-04-30 21:10:36 +0000
committeruckelman <uckelman@nomic.net>2010-04-30 21:10:36 +0000
commit140160e332d0ccf153e6e7487b2ec99402e6096f (patch)
treed5c651a2be5835caea0f8794dd7d8b6dc927bdd3 /src/forum_post_send.php
parent952a0953515f0854ef6d95317b38d4e1c12b916a (diff)
Refactored.
git-svn-id: https://vassalengine.svn.sourceforge.net/svnroot/vassalengine/site-src/trunk@6794 67b53d14-2c14-4ace-a08f-0dab2b34000c
Diffstat (limited to 'src/forum_post_send.php')
-rw-r--r--src/forum_post_send.php229
1 files changed, 229 insertions, 0 deletions
diff --git a/src/forum_post_send.php b/src/forum_post_send.php
new file mode 100644
index 0000000..cd103e7
--- /dev/null
+++ b/src/forum_post_send.php
@@ -0,0 +1,229 @@
+<?php
+
+try {
+ send_post_to_lists($config, $user, $mode, $data, $post_data);
+}
+catch (Exception $e) {
+ trigger_error($e, E_USER_ERROR);
+}
+
+function send_post_to_lists($config, $user, $mode, $data, $post_data) {
+
+ print '<p>';
+ var_dump($data);
+ var_dump($post_data);
+ print '</p>';
+
+ # Sanity check
+ if (!in_array($mode, array('post', 'reply', 'quote', 'edit'))) {
+ throw new Exception('unrecognized mode: ' . $mode);
+ }
+
+ require_once('Mail.php');
+
+ require_once(__DIR__ . '/BBCodeParser.php');
+ require_once(__DIR__ . '/Bridge.php');
+ require_once(__DIR__ . '/PhpBB3.php');
+ require_once(__DIR__ . '/Util.php');
+
+ $postId = $data['post_id'];
+ $forumId = $data['forum_id'];
+
+ $bridge = new Bridge();
+
+ $to = $bridge->getLists($forumId);
+ if (count($to) == 0) {
+ # No lists to send to, bail out.
+ return;
+ }
+ $to = implode(', ', $to);
+
+ $userName = $user->data['username'];
+ $userEmail = $user->data['user_email'];
+
+ $from = utf8_quote($userName) . ' <' . $userEmail . '>';
+ $sender = 'forum@test.nomic.net';
+ $subject = utf8_quote($post_data['post_subject']);
+
+ $phpbb = new PhpBB3();
+
+ $time = null;
+ if ($mode == 'edit') {
+ # Post time is NOT updated on edit, so we get the current time
+ $time = time();
+ }
+ else {
+ $time = $phpbb->getPostTime($postId);
+ if ($time === false) {
+ throw new Exception('no post time: ' . $postId);
+ }
+ }
+
+ $date = date(DATE_RFC2822, $time);
+
+ $inReplyTo = null;
+ $references = null;
+
+ if ($mode == 'reply' || $mode == 'quote') {
+ $firstId = $data['topic_first_post_id'];
+ $firstMessageId = $bridge->getMessageId($firstId);
+ if ($firstMessageId === false) {
+ throw new Exception('unrecognized post id: ' . $firstId);
+ }
+
+ $inReplyTo = $references = $firstMessageId;
+ }
+ else if ($mode == 'edit') {
+ $inReplyTo = $bridge->getMessageId($postId);
+ }
+
+ $forumURL = 'http://' . $_SERVER['SERVER_NAME'] .
+ dirname($_SERVER['SCRIPT_NAME']);
+
+ # Assemble the message headers
+ $headers = array(
+ 'To' => $to,
+ 'From' => $from,
+ 'Subject' => $subject,
+ 'Date' => $date,
+ 'Message-Id' => $messageId,
+ 'X-BeenThere' => $forumURL
+ );
+
+ if ($inReplyTo !== null) {
+ $headers['In-Reply-To'] = $inReplyTo;
+ }
+
+ if ($references !== null) {
+ $headers['References'] = $references;
+ }
+
+ # Build the message body
+ $parser = new BBCodeParser();
+ $text = $parser->parse($data['message'], $data['bbcode_uid']);
+
+ if ($mode == 'edit') {
+ $edit_notice = <<<EOF
+[This message has been edited.]
+
+
+EOF;
+
+ $edit_header = 'Edit: ';
+
+ $text = $edit_notice . $text;
+ $headers['Subject'] = $edit_header . $headers['Subject'];
+ }
+
+ # Build the bridge footer
+ $postURL = "$forumURL/viewtopic.php?p=$postId#p$postId";
+ $footer = <<<EOF
+
+_______________________________________________
+Read this topic online here:
+$postURL
+EOF;
+
+ $body = null;
+
+ # Handle attachements, if any
+ if (empty($data['attachment_data'])) {
+ # No attachments, send a plain email
+ $body = $text . "\n" . $footer;
+ $headers['Content-Type'] = 'text/plain; charset=UTF-8; format=flowed';
+ $headers['Content-Transfer-Encoding'] = '8bit';
+ }
+ else {
+ # Attachments, build a MIME email
+ require_once('Mail/mimePart.php');
+
+ $headers['MIME-Version'] = '1.0';
+
+ $params = array('content_type' => 'multipart/mixed');
+ $mime = new Mail_mimePart('', $params);
+
+ # Build the main body
+ build_text_part($mime, $text);
+
+ # Build each attachment
+ foreach ($data['attachment_data'] as $a) {
+ $attachId = $a['attach_id'];
+ $adata = $phpbb->getAttachmentData($attachId);
+ if ($adata === false) {
+ throw new Exception('unrecognized attachment id: ' . $attachId);
+ }
+
+ $afile = $phpbb_root_path . $config['upload_path'] . '/' .
+ utf8_basename($adata['physical_filename']);
+
+ $bytes = file_get_contents($afile);
+ if ($bytes === false) {
+ throw new Exception('failed to read file: ' . $afile);
+ }
+
+ build_attachment(
+ $mime,
+ $adata['mimetype'],
+ $adata['real_filename'],
+ $adata['attach_comment'],
+ $bytes
+ );
+ }
+
+ # Build footer
+ build_text_part($mime, $footer);
+
+ # Encode the message
+ $msg = $mime->encode();
+ $headers = array_merge($headers, $msg['headers']);
+ $body = $msg['body'];
+ }
+
+ $editId = $bridge->reserveEditId($postId);
+ $messageId = build_message_id($postId, $editId,
+ $time, $_SERVER['SERVER_NAME']);
+
+ $mailer = Mail::factory('sendmail');
+
+ # Register the message
+ $seen = !$bridge->registerByEditId($editId, $messageId, $inReplyTo);
+ if ($seen) {
+ throw new Exception('message id already seen: ' . $messageId);
+ }
+
+ try {
+ # Send the message
+ $err = $mailer->send($to, $headers, $body);
+ if (PEAR::isError($err)) {
+ throw new Exception('Mail::send error: ' . $err->toString());
+ }
+ }
+ catch (Exception $e) {
+ # Bridging failed, unregister message.
+ $bridge->unregisterMessage($editId);
+ throw $e;
+ }
+}
+
+function build_text_part($mime, $text) {
+ $params = array(
+ 'content_type' => 'text/plain',
+ 'charset' => 'utf-8',
+ 'encoding' => '8bit',
+ 'disposition' => 'inline'
+ );
+ $mime->addSubPart($text, $params);
+}
+
+function build_attachment($mime, $type, $filename, $descr, $data) {
+ $params = array(
+ 'content_type' => $type,
+ 'encoding' => 'base64',
+ 'disposition' => 'attachment',
+ 'dfilename' => $filename,
+ 'description' => $descr
+ );
+ $mime->addSubPart($data, $params);
+}
+
+?>