Merge pull request #1804 from annando/1508-public-relay
First steps for a relay for public posts
This commit is contained in:
commit
8f5d2471dd
3 changed files with 189 additions and 77 deletions
182
include/diaspora.php
Executable file → Normal file
182
include/diaspora.php
Executable file → Normal file
|
@ -23,8 +23,8 @@ function diaspora_dispatch_public($msg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
$r = q("SELECT `user`.* FROM `user` WHERE `user`.`uid` IN
|
$r = q("SELECT `user`.* FROM `user` WHERE `user`.`uid` IN
|
||||||
( SELECT `contact`.`uid` FROM `contact` WHERE `contact`.`network` = '%s' AND `contact`.`addr` = '%s' )
|
( SELECT `contact`.`uid` FROM `contact` WHERE `contact`.`network` = '%s' AND `contact`.`addr` = '%s' )
|
||||||
AND `account_expired` = 0 AND `account_removed` = 0 ",
|
AND `account_expired` = 0 AND `account_removed` = 0 ",
|
||||||
dbesc(NETWORK_DIASPORA),
|
dbesc(NETWORK_DIASPORA),
|
||||||
dbesc($msg['author'])
|
dbesc($msg['author'])
|
||||||
);
|
);
|
||||||
|
@ -34,8 +34,15 @@ function diaspora_dispatch_public($msg) {
|
||||||
diaspora_dispatch($rr,$msg);
|
diaspora_dispatch($rr,$msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
logger('diaspora_public: no subscribers');
|
logger('diaspora_public: no subscribers for '.$msg["author"].' '.print_r($msg, true));
|
||||||
|
|
||||||
|
// Use a dummy importer
|
||||||
|
$importer = array("uid" => 0, "page-flags" => PAGE_FREELOVE);
|
||||||
|
$result = diaspora_dispatch($importer,$msg);
|
||||||
|
|
||||||
|
logger("Dispatcher reported ".$result, LOGGER_DEBUG);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -545,7 +552,7 @@ function diaspora_decode($importer,$xml) {
|
||||||
// This will also convert diaspora public key from pkcs#1 to pkcs#8
|
// This will also convert diaspora public key from pkcs#1 to pkcs#8
|
||||||
|
|
||||||
logger('mod-diaspora: Fetching key for ' . $author_link );
|
logger('mod-diaspora: Fetching key for ' . $author_link );
|
||||||
$key = get_diaspora_key($author_link);
|
$key = get_diaspora_key($author_link);
|
||||||
|
|
||||||
if(! $key) {
|
if(! $key) {
|
||||||
logger('mod-diaspora: Could not retrieve author key.');
|
logger('mod-diaspora: Could not retrieve author key.');
|
||||||
|
@ -640,7 +647,7 @@ function diaspora_request($importer,$xml) {
|
||||||
|
|
||||||
$i = item_store($arr);
|
$i = item_store($arr);
|
||||||
if($i)
|
if($i)
|
||||||
proc_run('php',"include/notifier.php","activity","$i");
|
proc_run('php',"include/notifier.php","activity","$i");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -782,6 +789,11 @@ function diaspora_post_allow($importer,$contact) {
|
||||||
if($contact['rel'] == CONTACT_IS_FOLLOWER)
|
if($contact['rel'] == CONTACT_IS_FOLLOWER)
|
||||||
if($importer['page-flags'] == PAGE_COMMUNITY)
|
if($importer['page-flags'] == PAGE_COMMUNITY)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
// Messages for the global users are always accepted
|
||||||
|
if ($importer['uid'] == 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -823,8 +835,10 @@ function diaspora_post($importer,$xml,$msg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
$contact = diaspora_get_contact_by_handle($importer['uid'],$diaspora_handle);
|
$contact = diaspora_get_contact_by_handle($importer['uid'],$diaspora_handle);
|
||||||
if(! $contact)
|
if(! $contact) {
|
||||||
return;
|
logger('diaspora_post: A Contact for handle '.$diaspora_handle.' and user '.$importer['uid'].' was not found');
|
||||||
|
return 203;
|
||||||
|
}
|
||||||
|
|
||||||
if(! diaspora_post_allow($importer,$contact)) {
|
if(! diaspora_post_allow($importer,$contact)) {
|
||||||
logger('diaspora_post: Ignoring this author.');
|
logger('diaspora_post: Ignoring this author.');
|
||||||
|
@ -839,7 +853,7 @@ function diaspora_post($importer,$xml,$msg) {
|
||||||
);
|
);
|
||||||
if(count($r)) {
|
if(count($r)) {
|
||||||
logger('diaspora_post: message exists: ' . $guid);
|
logger('diaspora_post: message exists: ' . $guid);
|
||||||
return;
|
return 208;
|
||||||
}
|
}
|
||||||
|
|
||||||
$created = unxmlify($xml->created_at);
|
$created = unxmlify($xml->created_at);
|
||||||
|
@ -894,7 +908,7 @@ function diaspora_post($importer,$xml,$msg) {
|
||||||
$datarray['body'] = $body;
|
$datarray['body'] = $body;
|
||||||
$datarray['tag'] = $str_tags;
|
$datarray['tag'] = $str_tags;
|
||||||
if ($xml->provider_display_name)
|
if ($xml->provider_display_name)
|
||||||
$datarray["app"] = unxmlify($xml->provider_display_name);
|
$datarray["app"] = unxmlify($xml->provider_display_name);
|
||||||
else
|
else
|
||||||
$datarray['app'] = 'Diaspora';
|
$datarray['app'] = 'Diaspora';
|
||||||
|
|
||||||
|
@ -905,7 +919,9 @@ function diaspora_post($importer,$xml,$msg) {
|
||||||
DiasporaFetchGuid($datarray);
|
DiasporaFetchGuid($datarray);
|
||||||
$message_id = item_store($datarray);
|
$message_id = item_store($datarray);
|
||||||
|
|
||||||
return;
|
logger("Stored item with message id ".$message_id, LOGGER_DEBUG);
|
||||||
|
|
||||||
|
return 201;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -926,8 +942,8 @@ function DiasporaFetchGuidSub($match, $item) {
|
||||||
function diaspora_store_by_guid($guid, $server, $uid = 0) {
|
function diaspora_store_by_guid($guid, $server, $uid = 0) {
|
||||||
require_once("include/Contact.php");
|
require_once("include/Contact.php");
|
||||||
|
|
||||||
$serverparts = parse_url($server);
|
$serverparts = parse_url($server);
|
||||||
$server = $serverparts["scheme"]."://".$serverparts["host"];
|
$server = $serverparts["scheme"]."://".$serverparts["host"];
|
||||||
|
|
||||||
logger("Trying to fetch item ".$guid." from ".$server, LOGGER_DEBUG);
|
logger("Trying to fetch item ".$guid." from ".$server, LOGGER_DEBUG);
|
||||||
|
|
||||||
|
@ -959,7 +975,7 @@ function diaspora_store_by_guid($guid, $server, $uid = 0) {
|
||||||
|
|
||||||
$person = find_diaspora_person_by_handle($author);
|
$person = find_diaspora_person_by_handle($author);
|
||||||
|
|
||||||
$datarray = array();
|
$datarray = array();
|
||||||
$datarray['uid'] = $uid;
|
$datarray['uid'] = $uid;
|
||||||
$datarray['contact-id'] = get_contact($person['url'], $uid);
|
$datarray['contact-id'] = get_contact($person['url'], $uid);
|
||||||
$datarray['wall'] = 0;
|
$datarray['wall'] = 0;
|
||||||
|
@ -1644,11 +1660,11 @@ function diaspora_conversation($importer,$xml,$msg) {
|
||||||
);
|
);
|
||||||
if($r)
|
if($r)
|
||||||
$c = q("select * from conv where uid = %d and guid = '%s' limit 1",
|
$c = q("select * from conv where uid = %d and guid = '%s' limit 1",
|
||||||
intval($importer['uid']),
|
intval($importer['uid']),
|
||||||
dbesc($guid)
|
dbesc($guid)
|
||||||
);
|
);
|
||||||
if(count($c))
|
if(count($c))
|
||||||
$conversation = $c[0];
|
$conversation = $c[0];
|
||||||
}
|
}
|
||||||
if(! $conversation) {
|
if(! $conversation) {
|
||||||
logger('diaspora_conversation: unable to create conversation.');
|
logger('diaspora_conversation: unable to create conversation.');
|
||||||
|
@ -1934,7 +1950,7 @@ function diaspora_photo($importer,$xml,$msg,$attempt=1) {
|
||||||
$link_text = '[img]' . $remote_photo_path . $remote_photo_name . '[/img]' . "\n";
|
$link_text = '[img]' . $remote_photo_path . $remote_photo_name . '[/img]' . "\n";
|
||||||
|
|
||||||
$link_text = scale_external_images($link_text, true,
|
$link_text = scale_external_images($link_text, true,
|
||||||
array($remote_photo_name, 'scaled_full_' . $remote_photo_name));
|
array($remote_photo_name, 'scaled_full_' . $remote_photo_name));
|
||||||
|
|
||||||
if(strpos($parent_item['body'],$link_text) === false) {
|
if(strpos($parent_item['body'],$link_text) === false) {
|
||||||
$r = q("UPDATE `item` SET `body` = '%s', `visible` = 1 WHERE `id` = %d AND `uid` = %d",
|
$r = q("UPDATE `item` SET `body` = '%s', `visible` = 1 WHERE `id` = %d AND `uid` = %d",
|
||||||
|
@ -2598,28 +2614,28 @@ function diaspora_send_status($item,$owner,$contact,$public_batch = false) {
|
||||||
function diaspora_is_reshare($body) {
|
function diaspora_is_reshare($body) {
|
||||||
$body = trim($body);
|
$body = trim($body);
|
||||||
|
|
||||||
// Skip if it isn't a pure repeated messages
|
// Skip if it isn't a pure repeated messages
|
||||||
// Does it start with a share?
|
// Does it start with a share?
|
||||||
if (strpos($body, "[share") > 0)
|
if (strpos($body, "[share") > 0)
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
// Does it end with a share?
|
// Does it end with a share?
|
||||||
if (strlen($body) > (strrpos($body, "[/share]") + 8))
|
if (strlen($body) > (strrpos($body, "[/share]") + 8))
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
$attributes = preg_replace("/\[share(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism","$1",$body);
|
$attributes = preg_replace("/\[share(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism","$1",$body);
|
||||||
// Skip if there is no shared message in there
|
// Skip if there is no shared message in there
|
||||||
if ($body == $attributes)
|
if ($body == $attributes)
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
$guid = "";
|
$guid = "";
|
||||||
preg_match("/guid='(.*?)'/ism", $attributes, $matches);
|
preg_match("/guid='(.*?)'/ism", $attributes, $matches);
|
||||||
if ($matches[1] != "")
|
if ($matches[1] != "")
|
||||||
$guid = $matches[1];
|
$guid = $matches[1];
|
||||||
|
|
||||||
preg_match('/guid="(.*?)"/ism', $attributes, $matches);
|
preg_match('/guid="(.*?)"/ism', $attributes, $matches);
|
||||||
if ($matches[1] != "")
|
if ($matches[1] != "")
|
||||||
$guid = $matches[1];
|
$guid = $matches[1];
|
||||||
|
|
||||||
if ($guid != "") {
|
if ($guid != "") {
|
||||||
$r = q("SELECT `contact-id` FROM `item` WHERE `guid` = '%s' AND `network` IN ('%s', '%s') LIMIT 1",
|
$r = q("SELECT `contact-id` FROM `item` WHERE `guid` = '%s' AND `network` IN ('%s', '%s') LIMIT 1",
|
||||||
|
@ -2632,35 +2648,35 @@ function diaspora_is_reshare($body) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$profile = "";
|
$profile = "";
|
||||||
preg_match("/profile='(.*?)'/ism", $attributes, $matches);
|
preg_match("/profile='(.*?)'/ism", $attributes, $matches);
|
||||||
if ($matches[1] != "")
|
if ($matches[1] != "")
|
||||||
$profile = $matches[1];
|
$profile = $matches[1];
|
||||||
|
|
||||||
preg_match('/profile="(.*?)"/ism', $attributes, $matches);
|
preg_match('/profile="(.*?)"/ism', $attributes, $matches);
|
||||||
if ($matches[1] != "")
|
if ($matches[1] != "")
|
||||||
$profile = $matches[1];
|
$profile = $matches[1];
|
||||||
|
|
||||||
$ret= array();
|
$ret= array();
|
||||||
|
|
||||||
$ret["root_handle"] = preg_replace("=https?://(.*)/u/(.*)=ism", "$2@$1", $profile);
|
$ret["root_handle"] = preg_replace("=https?://(.*)/u/(.*)=ism", "$2@$1", $profile);
|
||||||
if (($ret["root_handle"] == $profile) OR ($ret["root_handle"] == ""))
|
if (($ret["root_handle"] == $profile) OR ($ret["root_handle"] == ""))
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
$link = "";
|
$link = "";
|
||||||
preg_match("/link='(.*?)'/ism", $attributes, $matches);
|
preg_match("/link='(.*?)'/ism", $attributes, $matches);
|
||||||
if ($matches[1] != "")
|
if ($matches[1] != "")
|
||||||
$link = $matches[1];
|
$link = $matches[1];
|
||||||
|
|
||||||
preg_match('/link="(.*?)"/ism', $attributes, $matches);
|
preg_match('/link="(.*?)"/ism', $attributes, $matches);
|
||||||
if ($matches[1] != "")
|
if ($matches[1] != "")
|
||||||
$link = $matches[1];
|
$link = $matches[1];
|
||||||
|
|
||||||
$ret["root_guid"] = preg_replace("=https?://(.*)/posts/(.*)=ism", "$2", $link);
|
$ret["root_guid"] = preg_replace("=https?://(.*)/posts/(.*)=ism", "$2", $link);
|
||||||
if (($ret["root_guid"] == $link) OR ($ret["root_guid"] == ""))
|
if (($ret["root_guid"] == $link) OR ($ret["root_guid"] == ""))
|
||||||
return(false);
|
return(false);
|
||||||
|
|
||||||
return($ret);
|
return($ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
function diaspora_send_images($item,$owner,$contact,$images,$public_batch = false) {
|
function diaspora_send_images($item,$owner,$contact,$images,$public_batch = false) {
|
||||||
|
@ -2714,7 +2730,7 @@ function diaspora_send_followup($item,$owner,$contact,$public_batch = false) {
|
||||||
// likes on comments
|
// likes on comments
|
||||||
if($item['verb'] === ACTIVITY_LIKE && $item['thr-parent']) {
|
if($item['verb'] === ACTIVITY_LIKE && $item['thr-parent']) {
|
||||||
$p = q("select guid, type, uri, `parent-uri` from item where uri = '%s' limit 1",
|
$p = q("select guid, type, uri, `parent-uri` from item where uri = '%s' limit 1",
|
||||||
dbesc($item['thr-parent'])
|
dbesc($item['thr-parent'])
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -2792,7 +2808,7 @@ function diaspora_send_relay($item,$owner,$contact,$public_batch = false) {
|
||||||
// likes on comments
|
// likes on comments
|
||||||
if($item['verb'] === ACTIVITY_LIKE && $item['thr-parent']) {
|
if($item['verb'] === ACTIVITY_LIKE && $item['thr-parent']) {
|
||||||
$p = q("select guid, type, uri, `parent-uri` from item where uri = '%s' limit 1",
|
$p = q("select guid, type, uri, `parent-uri` from item where uri = '%s' limit 1",
|
||||||
dbesc($item['thr-parent'])
|
dbesc($item['thr-parent'])
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -3064,3 +3080,47 @@ function diaspora_transmit($owner,$contact,$slap,$public_batch,$queue_run=false)
|
||||||
|
|
||||||
return(($return_code) ? $return_code : (-1));
|
return(($return_code) ? $return_code : (-1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function diaspora_fetch_relay() {
|
||||||
|
|
||||||
|
$serverdata = get_config("system", "relay_server");
|
||||||
|
if ($serverdata == "")
|
||||||
|
return array();
|
||||||
|
|
||||||
|
$relay = array();
|
||||||
|
|
||||||
|
$servers = explode(",", $serverdata);
|
||||||
|
|
||||||
|
foreach($servers AS $server) {
|
||||||
|
$server = trim($server);
|
||||||
|
$batch = $server."/receive/public";
|
||||||
|
|
||||||
|
$relais = q("SELECT `batch`, `id`, `name`,`network` FROM `contact` WHERE `uid` = 0 AND `batch` = '%s' LIMIT 1", dbesc($batch));
|
||||||
|
|
||||||
|
if (!$relais) {
|
||||||
|
$addr = "relay@".str_replace("http://", "", normalise_link($server));
|
||||||
|
|
||||||
|
$r = q("INSERT INTO `contact` (`uid`, `created`, `name`, `nick`, `addr`, `url`, `nurl`, `batch`, `network`, `rel`, `blocked`, `pending`, `writable`, `name-date`, `uri-date`, `avatar-date`)
|
||||||
|
VALUES (0, '%s', '%s', 'relay', '%s', '%s', '%s', '%s', '%s', %d, 0, 0, 1, '%s', '%s', '%s')",
|
||||||
|
datetime_convert(),
|
||||||
|
dbesc($addr),
|
||||||
|
dbesc($addr),
|
||||||
|
dbesc($server),
|
||||||
|
dbesc(normalise_link($server)),
|
||||||
|
dbesc($batch),
|
||||||
|
dbesc(NETWORK_DIASPORA),
|
||||||
|
intval(CONTACT_IS_FOLLOWER),
|
||||||
|
dbesc(datetime_convert()),
|
||||||
|
dbesc(datetime_convert()),
|
||||||
|
dbesc(datetime_convert())
|
||||||
|
);
|
||||||
|
|
||||||
|
$relais = q("SELECT `batch`, `id`, `name`,`network` FROM `contact` WHERE `uid` = 0 AND `batch` = '%s' LIMIT 1", dbesc($batch));
|
||||||
|
if ($relais)
|
||||||
|
$relay[] = $relais[0];
|
||||||
|
} else
|
||||||
|
$relay[] = $relais[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $relay;
|
||||||
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ require_once("boot.php");
|
||||||
require_once('include/queue_fn.php');
|
require_once('include/queue_fn.php');
|
||||||
require_once('include/html2plain.php');
|
require_once('include/html2plain.php');
|
||||||
require_once("include/Scrape.php");
|
require_once("include/Scrape.php");
|
||||||
|
require_once('include/diaspora.php');
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This file was at one time responsible for doing all deliveries, but this caused
|
* This file was at one time responsible for doing all deliveries, but this caused
|
||||||
|
@ -874,8 +875,6 @@ function notifier_run(&$argv, &$argc){
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case NETWORK_DIASPORA:
|
case NETWORK_DIASPORA:
|
||||||
require_once('include/diaspora.php');
|
|
||||||
|
|
||||||
if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')))
|
if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -958,6 +957,11 @@ function notifier_run(&$argv, &$argc){
|
||||||
|
|
||||||
if($public_message) {
|
if($public_message) {
|
||||||
|
|
||||||
|
if (!$followup)
|
||||||
|
$r0 = diaspora_fetch_relay();
|
||||||
|
else
|
||||||
|
$r0 = array();
|
||||||
|
|
||||||
$r1 = q("SELECT DISTINCT(`batch`), `id`, `name`,`network` FROM `contact` WHERE `network` = '%s'
|
$r1 = q("SELECT DISTINCT(`batch`), `id`, `name`,`network` FROM `contact` WHERE `network` = '%s'
|
||||||
AND `uid` = %d AND `rel` != %d group by `batch` ORDER BY rand() ",
|
AND `uid` = %d AND `rel` != %d group by `batch` ORDER BY rand() ",
|
||||||
dbesc(NETWORK_DIASPORA),
|
dbesc(NETWORK_DIASPORA),
|
||||||
|
@ -974,7 +978,7 @@ function notifier_run(&$argv, &$argc){
|
||||||
intval(CONTACT_IS_SHARING)
|
intval(CONTACT_IS_SHARING)
|
||||||
);
|
);
|
||||||
|
|
||||||
$r = array_merge($r2,$r1);
|
$r = array_merge($r2,$r1,$r0);
|
||||||
|
|
||||||
if(count($r)) {
|
if(count($r)) {
|
||||||
logger('pubdeliver: ' . print_r($r,true), LOGGER_DEBUG);
|
logger('pubdeliver: ' . print_r($r,true), LOGGER_DEBUG);
|
||||||
|
|
|
@ -2,13 +2,61 @@
|
||||||
require_once("mod/hostxrd.php");
|
require_once("mod/hostxrd.php");
|
||||||
|
|
||||||
function _well_known_init(&$a){
|
function _well_known_init(&$a){
|
||||||
if ($a->argc > 1) {
|
if ($a->argc > 1) {
|
||||||
switch($a->argv[1]) {
|
switch($a->argv[1]) {
|
||||||
case "host-meta":
|
case "host-meta":
|
||||||
hostxrd_init($a);
|
hostxrd_init($a);
|
||||||
break;
|
break;
|
||||||
}
|
case "x-social-relay":
|
||||||
}
|
wk_social_relay($a);
|
||||||
http_status_exit(404);
|
break;
|
||||||
killme();
|
}
|
||||||
|
}
|
||||||
|
http_status_exit(404);
|
||||||
|
killme();
|
||||||
|
}
|
||||||
|
|
||||||
|
function wk_social_relay(&$a) {
|
||||||
|
|
||||||
|
define('SR_SCOPE_ALL', 'all');
|
||||||
|
define('SR_SCOPE_TAGS', 'tags');
|
||||||
|
|
||||||
|
$subscribe = (bool)get_config('system', 'relay_subscribe');
|
||||||
|
|
||||||
|
if ($subscribe)
|
||||||
|
$scope = get_config('system', 'relay_scope');
|
||||||
|
else
|
||||||
|
$scope = "";
|
||||||
|
|
||||||
|
$tags = array();
|
||||||
|
|
||||||
|
if ($scope == SR_SCOPE_TAGS) {
|
||||||
|
|
||||||
|
$server_tags = get_config('system', 'relay_server_tags');
|
||||||
|
$tagitems = explode(",", $server_tags);
|
||||||
|
|
||||||
|
foreach($tagitems AS $tag)
|
||||||
|
$tags[trim($tag, "# ")] = trim($tag, "# ");
|
||||||
|
|
||||||
|
if (get_config('system', 'relay_user_tags')) {
|
||||||
|
$terms = q("SELECT DISTINCT(`term`) FROM `search`");
|
||||||
|
|
||||||
|
foreach($terms AS $term) {
|
||||||
|
$tag = trim($term["term"], "#");
|
||||||
|
$tags[$tag] = $tag;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$taglist = array();
|
||||||
|
foreach($tags AS $tag)
|
||||||
|
$taglist[] = $tag;
|
||||||
|
|
||||||
|
$relay = array("subscribe" => $subscribe,
|
||||||
|
"scope" => $scope,
|
||||||
|
"tags" => $taglist);
|
||||||
|
|
||||||
|
header('Content-type: application/json; charset=utf-8');
|
||||||
|
echo json_encode($relay, true);
|
||||||
|
exit;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue