If a post is dedicated to a single forum then it will be rewritten to a forum post

This commit is contained in:
Michael 2017-11-01 23:20:43 +00:00
parent db04a78d84
commit 82321114ab
3 changed files with 90 additions and 11 deletions

View file

@ -1987,6 +1987,81 @@ class dfrn {
return true; 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 * @brief Updates an item
* *
@ -2006,15 +2081,15 @@ class dfrn {
return false; 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)", if (!self::rewriteDedicatedForumPost($item)) {
dbesc($item["title"]), $fields = array('title' => $item["title"], 'body' => $item["body"],
dbesc($item["body"]), 'tag' => $item["tag"], 'changed' => datetime_convert(),
dbesc($item["tag"]), 'edited' => datetime_convert("UTC", "UTC", $item["edited"]));
dbesc(datetime_convert("UTC","UTC",$item["edited"])),
dbesc(datetime_convert()), $condition = array("`uri` = ? AND `uid` IN (0, ?)", $item["uri"], $importer["importer_uid"]);
dbesc($item["uri"]), dba::update('item', $fields, $condition);
intval($importer["importer_uid"]) }
);
create_tags_from_itemuri($item["uri"], $importer["importer_uid"]); create_tags_from_itemuri($item["uri"], $importer["importer_uid"]);
update_thread_uri($item["uri"], $importer["importer_uid"]); update_thread_uri($item["uri"], $importer["importer_uid"]);

View file

@ -575,6 +575,7 @@ function item_post(App $a) {
$tagged = array(); $tagged = array();
$private_forum = false; $private_forum = false;
$only_to_forum = false;
if (count($tags)) { if (count($tags)) {
foreach ($tags as $tag) { 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 // 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 == '!'))) { if (is_array($success['contact']) && ($success['contact']['prv'] || ($tag_type == '!'))) {
$private_forum = true; $private_forum = true;
$only_to_forum = ($tag_type == '!');
$private_id = $success['contact']['id']; $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. // we tagged a private forum in a top level post and the message was public.
// Restrict it. // Restrict it.
$private = 1; $private = 1;

View file

@ -127,7 +127,9 @@ class Item extends BaseObject {
? t('Private Message') ? t('Private Message')
: false); : false);
$shareable = ((($conv->get_profile_owner() == local_user()) && ($item['private'] != 1)) ? true : 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) { if ($item["event-id"] != 0) {
$edpost = array("events/event/".$item['event-id'], t("Edit")); $edpost = array("events/event/".$item['event-id'], t("Edit"));
} else { } else {