diff --git a/doc/Forums.md b/doc/Forums.md index 78a3e193e5..add1601c50 100644 --- a/doc/Forums.md +++ b/doc/Forums.md @@ -58,6 +58,11 @@ Also, if the forum is a public forum, your posting will be public for the all in If your post is private you must also explicitly include the group in the post permissions (to allow the forum "contact" to see the post) **and** mention it in a tag (which redistributes the post to the forum members). Posting privately to a public forum, will result in your posting being displayed on the forum wall, but not on yours. +Additionally it is possible to address a forum with the exclamation mark. +In the example above this means that you can address the bicycle forum via !bicycle. +The difference to the @ is that the post will only be sent to the addressed forum. +This also means that you shouldn't address multiple forums in a single post in that way since it will only be distributed by one the forums. + You may also post to a community forum by posting a "wall-to-wall" post using secure cross-site authentication. Comments which are relayed to community forums will be relayed back to the original post creator. diff --git a/doc/de/Forums.md b/doc/de/Forums.md index 1d7c5cec88..ec3ad1400c 100644 --- a/doc/de/Forums.md +++ b/doc/de/Forums.md @@ -52,6 +52,11 @@ Wenn Du Mitglied eines Community-Forums bist, kannst Du das Forum in einem Beitr Zum Beispiel würde @Fahrrad Deinen Beitrag neben den sonst ausgewählten Nutzern an alle Nutzer schicken, die in der Gruppe "Fahrrad" sind. Wenn Dein Beitrag privat ist, musst Du diese Gruppe explizit in den Zugriffsrechten des Beitrags auswählen **und** sie mit dem @-Tag erwähnen (was den Beitrag auf die Gruppenmitglieder erweitert). +Zusätzlich ist es möglich, Foren mit dem Ausrufezeichen zu adressieren. +Im obigen Beispiel bedeutet dies, dass Du das Fahrrad-Forum per !Fahrrad erreichen würdest. +Der Unterschied zum @ besteht darin, dass der Beitrag auschließlich über das Forum verbreitet wird und nicht an weitere Nutzer. +Dies bedeutet auch, dass es nicht sinnvoll ist, mehrere Foren per ! in einem Beitrag zu adressieren, da nur eines der Foren den Beitrag verbreiten wird. + Du kannst außerdem via "Wall zu Wall" einen Beitrag auf der Community-Seite bzw. in dem Community-Forum erstellen. Kommentare, die Du an ein Community-Forum schickst, werden dem Originalbeitrag hinzugefügt. diff --git a/include/acl_selectors.php b/include/acl_selectors.php index 8205854ba6..32348c2330 100644 --- a/include/acl_selectors.php +++ b/include/acl_selectors.php @@ -478,9 +478,18 @@ function acl_lookup(App $a, $out_type = 'json') { intval(local_user()) ); $contact_count = (int)$r[0]['c']; - } - elseif ($type == 'm') { - + } elseif ($type == 'f') { + // autocomplete for editor mentions of forums + $r = q("SELECT COUNT(*) AS c FROM `contact` + WHERE `uid` = %d AND NOT `self` + AND NOT `blocked` AND NOT `pending` AND NOT `archive` + AND (`forum` OR `prv`) + AND `success_update` >= `failure_update` + AND `notify` != '' $sql_extra2" , + intval(local_user()) + ); + $contact_count = (int)$r[0]['c']; + } elseif ($type == 'm') { // autocomplete for Private Messages $r = q("SELECT COUNT(*) AS c FROM `contact` @@ -495,8 +504,7 @@ function acl_lookup(App $a, $out_type = 'json') { ); $contact_count = (int)$r[0]['c']; - } - elseif ($type == 'a') { + } elseif ($type == 'a') { // autocomplete for Contacts @@ -570,8 +578,17 @@ function acl_lookup(App $a, $out_type = 'json') { intval(local_user()), dbesc(NETWORK_STATUSNET) ); - } - elseif ($type == 'm') { + } elseif ($type == 'f') { + $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr`, `forum`, `prv` FROM `contact` + WHERE `uid` = %d AND NOT `self` AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND `notify` != '' + AND `success_update` >= `failure_update` AND NOT (`network` IN ('%s')) + AND (`forum` OR `prv`) + $sql_extra2 + ORDER BY `name` ASC ", + intval(local_user()), + dbesc(NETWORK_STATUSNET) + ); + } elseif ($type == 'm') { $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr` FROM `contact` WHERE `uid` = %d AND NOT `self` AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND `success_update` >= `failure_update` AND `network` IN ('%s','%s','%s') diff --git a/include/items.php b/include/items.php index d1c91b9403..4af4c6ab37 100644 --- a/include/items.php +++ b/include/items.php @@ -853,7 +853,7 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f * The original author commented, but as this is a comment, the permissions * weren't fixed up so it will still show the comment as private unless we fix it here. */ - if ((intval($r[0]['forum_mode']) == 1) && (! $r[0]['private'])) { + if ((intval($r[0]['forum_mode']) == 1) && $r[0]['private']) { $arr['private'] = 0; } diff --git a/js/autocomplete.js b/js/autocomplete.js index 58dde55a6d..219ad794bc 100644 --- a/js/autocomplete.js +++ b/js/autocomplete.js @@ -203,6 +203,15 @@ function string2bb(element) { template: contact_format, }; + // Autocomplete forums + forums = { + match: /(^|\s)(!\!*)([^ \n]+)$/, + index: 3, + search: function(term, callback) { contact_search(term, callback, backend_url, 'f'); }, + replace: editor_replace, + template: contact_format, + }; + // Autocomplete smilies e.g. ":like" smilies = { match: /(^|\s)(:[a-z]{2,})$/, @@ -213,7 +222,7 @@ function string2bb(element) { }; this.attr('autocomplete','off'); - this.textcomplete([contacts,smilies], {className:'acpopup', zIndex:10000}); + this.textcomplete([contacts, forums, smilies], {className:'acpopup', zIndex:10000}); }; })( jQuery ); diff --git a/mod/item.php b/mod/item.php index 8abee8e4f6..0bb0d17dbe 100644 --- a/mod/item.php +++ b/mod/item.php @@ -557,7 +557,11 @@ function item_post(App $a) { INNER JOIN `item` ON `item`.`contact-id` = `contact`.`id` AND `contact`.`url` = `item`.`author-link` WHERE `item`.`id` = `item`.`parent` AND `item`.`parent` = %d", intval($parent)); if (dbm::is_result($toplevel_parent)) { - $toplevel_contact = '@' . $toplevel_parent[0]['nick'] . '+' . $toplevel_parent[0]['id']; + if (!empty($toplevel_parent[0]['addr'])) { + $toplevel_contact = '@' . $toplevel_parent[0]['addr']; + } else { + $toplevel_contact = '@' . $toplevel_parent[0]['nick'] . '+' . $toplevel_parent[0]['id']; + } } else { $toplevel_parent = q("SELECT `author-link`, `author-name` FROM `item` WHERE `id` = `parent` AND `parent` = %d", intval($parent)); $toplevel_contact = '@[url=' . $toplevel_parent[0]['author-link'] . ']' . $toplevel_parent[0]['author-name'] . '[/url]'; @@ -575,7 +579,9 @@ function item_post(App $a) { if (count($tags)) { foreach ($tags as $tag) { - if (strpos($tag, '#') === 0) { + $tag_type = substr($tag, 0, 1); + + if ($tag_type == '#') { continue; } @@ -599,14 +605,15 @@ function item_post(App $a) { if ($success['replaced']) { $tagged[] = $tag; } - if (is_array($success['contact']) && intval($success['contact']['prv'])) { + // 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; $private_id = $success['contact']['id']; } } } - if (($private_forum) && (! $parent) && (! $private)) { + if ($private_forum && !$parent && !$private) { // we tagged a private forum in a top level post and the message was public. // Restrict it. $private = 1; @@ -1107,9 +1114,11 @@ function handle_tag(App $a, &$body, &$inform, &$str_tags, $profile_uid, $tag, $n $replaced = false; $r = null; + $tag_type = '@'; //is it a person tag? - if (strpos($tag, '@') === 0) { + if ((strpos($tag, '@') === 0) || (strpos($tag, '!') === 0)) { + $tag_type = substr($tag, 0, 1); //is it already replaced? if (strpos($tag, '[url=')) { //append tag to str_tags @@ -1121,7 +1130,7 @@ function handle_tag(App $a, &$body, &$inform, &$str_tags, $profile_uid, $tag, $n } // Checking for the alias that is used for OStatus - $pattern = "/@\[url\=(.*?)\](.*?)\[\/url\]/ism"; + $pattern = "/[@!]\[url\=(.*?)\](.*?)\[\/url\]/ism"; if (preg_match($pattern, $tag, $matches)) { $r = q("SELECT `alias`, `name` FROM `contact` WHERE `nurl` = '%s' AND `alias` != '' AND `uid` = 0", @@ -1282,12 +1291,11 @@ function handle_tag(App $a, &$body, &$inform, &$str_tags, $profile_uid, $tag, $n //if there is an url for this persons profile if (isset($profile) && ($newname != "")) { - $replaced = true; // create profile link $profile = str_replace(',', '%2c', $profile); - $newtag = '@[url=' . $profile . ']' . $newname . '[/url]'; - $body = str_replace('@' . $name, $newtag, $body); + $newtag = $tag_type.'[url=' . $profile . ']' . $newname . '[/url]'; + $body = str_replace($tag_type . $name, $newtag, $body); // append tag to str_tags if (! stristr($str_tags, $newtag)) { if (strlen($str_tags)) {