]> git.mxchange.org Git - friendica.git/commitdiff
If a post is dedicated to a single forum then it will be rewritten to a forum post
authorMichael <heluecht@pirati.ca>
Wed, 1 Nov 2017 23:20:43 +0000 (23:20 +0000)
committerMichael <heluecht@pirati.ca>
Wed, 1 Nov 2017 23:20:43 +0000 (23:20 +0000)
include/dfrn.php
mod/item.php
object/Item.php

index 55c51cb0118a69fd482b2f61c13a9046656647c0..faa98c8e2997220759d8ca73dd74039ee83bcd04 100644 (file)
@@ -1987,6 +1987,81 @@ class dfrn {
                return true;
        }
 
+       /**
+        * @brief Check and possibly rewrite a post if it was a dedicated forum post
+        *
+        * @param array $item the new item record
+        *
+        * @return boolean Was the post be rewritten?
+        */
+       private static function rewriteDedicatedForumPost($item) {
+               $fields = array('author-link', 'allow_cid', 'contact-id', 'private', 'wall', 'id', 'parent');
+               $condition = array('uri' => $item['uri'], 'uid' => $item['uid']);
+               $existing = dba::select('item', $fields, $condition, array('limit' => 1));
+               if (!dbm::is_result($existing)) {
+                       return false;
+               }
+
+               // Only rewrite if the former post was a private starting post
+               if (!$existing['wall'] || !$existing['private'] || ($existing['id'] != $existing['parent'])) {
+                       return false;
+               }
+
+               // Is the post only directed to a sigle forum
+               if ($existing['allow_cid'] != '<'.$item['contact-id'].'>') {
+                       return false;
+               }
+
+               $fields = array('id');
+               $condition = array('uid' => $item['uid'], 'self' => true);
+               $self = dba::select('contact', $fields, $condition, array('limit' => 1));
+               if (!dbm::is_result($self)) {
+                       return false;
+               }
+
+               // is the original item created by the "self" user.
+               if ($self['id'] != $existing['contact-id']) {
+                       return false;
+               }
+
+               $fields = array('forum', 'prv');
+               $condition = array('id' => $item['contact-id']);
+               $contact = dba::select('contact', $fields, $condition, array('limit' => 1));
+               if (!dbm::is_result($contact)) {
+                       return false;
+               }
+
+               // Is the post from a forum?
+               if (!$contact['forum'] && !$contact['prv']) {
+                       return false;
+               }
+
+               /// @todo There is an ugly downside of this whole rewrite process: These items loose the ability to be edited by the user.
+               logger('Item '.$item['uri'].' will be rewritten.', LOGGER_DEBUG);
+
+               $item = store_conversation($item);
+               unset($fields['dsprsig']);
+
+               // Rewrite to a public post if it comes from a public forum
+               if ($contact['forum']) {
+                       $item['allow_cid'] = '';
+                       $item['allow_gid'] = '';
+                       $item['deny_cid'] = '';
+                       $item['deny_gid'] = '';
+                       $item['private'] = false;
+               }
+
+               $item['wall'] = false;
+
+               $item["owner-id"] = get_contact($item["owner-link"], 0);
+
+               $condition = array('uri' => $item["uri"], 'uid' => $item["uid"]);
+               dba::update('item', $item, $condition);
+
+               add_thread($existing['id']);
+               return true;
+       }
+
        /**
         * @brief Updates an item
         *
@@ -2006,15 +2081,15 @@ class dfrn {
                                return false;
                        }
 
-                       $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `tag` = '%s', `edited` = '%s', `changed` = '%s' WHERE `uri` = '%s' AND `uid` IN (0, %d)",
-                               dbesc($item["title"]),
-                               dbesc($item["body"]),
-                               dbesc($item["tag"]),
-                               dbesc(datetime_convert("UTC","UTC",$item["edited"])),
-                               dbesc(datetime_convert()),
-                               dbesc($item["uri"]),
-                               intval($importer["importer_uid"])
-                       );
+                       if (!self::rewriteDedicatedForumPost($item)) {
+                               $fields = array('title' => $item["title"], 'body' => $item["body"],
+                                               'tag' => $item["tag"], 'changed' => datetime_convert(),
+                                               'edited' => datetime_convert("UTC", "UTC", $item["edited"]));
+
+                               $condition = array("`uri` = ? AND `uid` IN (0, ?)", $item["uri"], $importer["importer_uid"]);
+                               dba::update('item', $fields, $condition);
+                       }
+
                        create_tags_from_itemuri($item["uri"], $importer["importer_uid"]);
                        update_thread_uri($item["uri"], $importer["importer_uid"]);
 
index 0bb0d17dbe2813127b121fdfac488b13c3be3d37..77f927223b084d444942f4580d07cbd8b0afe16e 100644 (file)
@@ -575,6 +575,7 @@ function item_post(App $a) {
        $tagged = array();
 
        $private_forum = false;
+       $only_to_forum = false;
 
        if (count($tags)) {
                foreach ($tags as $tag) {
@@ -608,12 +609,13 @@ function item_post(App $a) {
                        // When the forum is private or the forum is addressed with a "!" make the post private
                        if (is_array($success['contact']) && ($success['contact']['prv'] || ($tag_type == '!'))) {
                                $private_forum = true;
+                               $only_to_forum = ($tag_type == '!');
                                $private_id = $success['contact']['id'];
                        }
                }
        }
 
-       if ($private_forum && !$parent && !$private) {
+       if ($private_forum && !$parent && (!$private || $only_to_forum)) {
                // we tagged a private forum in a top level post and the message was public.
                // Restrict it.
                $private = 1;
index 4f89ea804c92eac4cdf3361a16a890b7e2e262ec..c7a1bcabbd43bf70de8415c4c287708c33655627 100644 (file)
@@ -127,7 +127,9 @@ class Item extends BaseObject {
                        ? t('Private Message')
                        : false);
                $shareable = ((($conv->get_profile_owner() == local_user()) && ($item['private'] != 1)) ? true : false);
-               if (local_user() && link_compare($a->contact['url'],$item['author-link'])) {
+
+               /// @todo The check for the contact-id is here to block editing of rewritten forum posts - see function dfrn::rewriteDedicatedForumPost
+               if (local_user() && link_compare($a->contact['url'],$item['author-link']) && ($a->contact['id'] == $item['contact-id'])) {
                        if ($item["event-id"] != 0) {
                                $edpost = array("events/event/".$item['event-id'], t("Edit"));
                        } else {