summaryrefslogtreecommitdiff
path: root/src/MailmanToPhpBB3.php
blob: 1eaac325af1b18798c79d0ed8f2b65c1aa11270e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<?php

#
# forum-list bridge 
# Copyright (C) 2010 Joel Uckelman
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#

require_once('Log.php');

require_once(__DIR__ . '/Bridge.php');
require_once(__DIR__ . '/Message.php');
require_once(__DIR__ . '/PhpBB3.php');

class MailmanToPhpBB3 {
  protected $bridge;
  protected $phpbb;
  protected $logger;

  public function __construct(Bridge $bridge, PhpBB3 $phpbb, Log $logger) {
    $this->bridge = $bridge;
    $this->phpbb = $phpbb;
    $this->logger = $logger;
  }

  public function process(Message $msg) {
    $messageId = $msg->getMessageId();
    $inReplyTo = $msg->getInReplyTo();
    $rererences = $msg->getReferences();
    $source = $msg->getSource();
  
    $this->logger->info($messageId . ' received from ' . $source);

    $editId = $this->bridge->registerByMessageId($messageId, $inReplyTo);

    if ($editId === false) {
      # This message has already been processed, bail out
      $this->logger->info($messageId . ' already seen, skipping');
      exit;
    }

    try {
      list($postType, $forumId, $topicId) =
        $this->find_destination($source, $inReplyTo, $messageId);

      $this->logger->info(
      $messageId . ' will be posted to ' . $forumId . ':' . $topicId);
 
      # Post the message to the forum
      $postId = $this->phpbb->postMessage($postType, $forumId, $topicId, $msg);
      $this->bridge->setPostId($messageId, $postId);

      $this->logger->info($messageId . ' posted as ' . $postId);
    }
    catch (Exception $e) {
      # Bridging failed, unregister message.
      $this->bridge->unregisterMessage($editId);
      throw $e; 
    }
  }

  protected function find_destination($source, $inReplyTo, $messageId) {
    $forumId = $topicId = null;
    $postType = null;
  
    if ($inReplyTo) { 
      # Possibly a reply to an existing topic
      $parentId = $this->bridge->getPostId($inReplyTo);
      if ($parentId === false) {
# FIXME: we need to try harder to find where this message goes, instead
# of dropping it!
        throw new Exception('unrecognized Reply-To: ' . $inReplyTo);
      }

      $ids = $this->phpbb->getTopicAndForumIds($parentId);
      if ($ids === false) {
        throw new Exception('unrecognized parent id: ' . $parentId);
      }

      # Found the parent's forum and topic, post to those
      $forumId = $ids['forum_id'];
      $topicId = $ids['topic_id'];
      $postType = 'reply';

      $this->logger->info($messageId . ' replies to ' . $parentId);
    }
    else {
      # A message starting a new topic, post to default forum for its source
      $forumId = $this->bridge->getDefaultForumId($source);
      if ($forumId === false) {
        throw new Exception('unrecognized source: ' . $source);  
      }

      $postType = 'post';

      $this->logger->info($messageId . ' is a new post');
    }

    return array($postType, $forumId, $topicId);
  }
}

?>