From 140160e332d0ccf153e6e7487b2ec99402e6096f Mon Sep 17 00:00:00 2001
From: uckelman 
Date: Fri, 30 Apr 2010 21:10:36 +0000
Subject: Refactored.
git-svn-id: https://vassalengine.svn.sourceforge.net/svnroot/vassalengine/site-src/trunk@6794 67b53d14-2c14-4ace-a08f-0dab2b34000c
---
 src/forum_post_send.php | 229 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 229 insertions(+)
 create mode 100644 src/forum_post_send.php
(limited to 'src/forum_post_send.php')
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 @@
+';
+  var_dump($data);
+  var_dump($post_data);
+  print '
';
+
+  # 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 = << '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);
+}
+
+?>
-- 
cgit v1.2.3