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)) {