forked from GNUsocial/gnu-social
[TheFreeNetwork] Handle new StartTFNLookup and EndTFNLookup events
EVENTS: - describe new events TheFreeNetworkModule: - add event handlers and necessary auxiliary methods - minor comment updates
This commit is contained in:
parent
9aedcc7997
commit
64104cb182
@ -1,2 +1,11 @@
|
|||||||
StartTFNCensus: when all plugins have been initialized; federation plugins must populate this event's array with their profile class name
|
StartTFNCensus: when all plugins have been initialized; federation plugins must populate this event's array with their profile class name
|
||||||
@param array $free_network
|
@param array $free_network
|
||||||
|
|
||||||
|
StartTFNLookup: tries to locate a duplicated remote profile by URI; federation plugins must trigger this event before profile insertion
|
||||||
|
@param string $uri URI of the remote profile to be inserted
|
||||||
|
@param string $class profile class of the federation protocol that triggered the event
|
||||||
|
@param int|null &$profile_id profile ID associated with the duplicated remote profile found
|
||||||
|
|
||||||
|
EndTFNLookup: deletes a previous duplicated remote profile found; federation plugins must trigget this event after successfully inserting a new profile
|
||||||
|
@param string $class profile class of the federation protocol that triggered the event
|
||||||
|
@param int &$profile_id profile ID associated with the duplicated remote profile
|
||||||
|
@ -42,19 +42,74 @@ class TheFreeNetworkModule extends Module
|
|||||||
const MODULE_VERSION = '0.1.0alpha0';
|
const MODULE_VERSION = '0.1.0alpha0';
|
||||||
|
|
||||||
private $free_network = []; // name of the profile classes of the active federation protocols
|
private $free_network = []; // name of the profile classes of the active federation protocols
|
||||||
|
private $lrdd = false; // whether LRDD plugin is active or not
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when all plugins have been initialized
|
* Called when all plugins have been initialized
|
||||||
* We'll populate the $free_network array here
|
* We'll populate our variables here
|
||||||
*
|
*
|
||||||
* @return boolean hook value
|
* @return bool hook value
|
||||||
*/
|
*/
|
||||||
public function onInitializePlugin()
|
public function onInitializePlugin(): bool
|
||||||
{
|
{
|
||||||
|
// $free_network array
|
||||||
Event::handle('StartTFNCensus', [&$this->free_network]);
|
Event::handle('StartTFNCensus', [&$this->free_network]);
|
||||||
|
|
||||||
|
// $lrdd flag
|
||||||
|
$this->lrdd = PluginList::isPluginActive("LRDD");
|
||||||
|
$this->log(LOG_INFO, 'LRDD IS ' . ($this->lrdd ? 'ON' : 'OFF'));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A new remote profile is being added, check if we
|
||||||
|
* already have someone with the same URI.
|
||||||
|
*
|
||||||
|
* @param string $uri
|
||||||
|
* @param string $class profile class that triggered this event
|
||||||
|
* @param int|null &$profile_id Profile:id associated with the remote entity found
|
||||||
|
* @return bool hook flag
|
||||||
|
*/
|
||||||
|
public function onStartTFNLookup(string $uri, string $class, int &$profile_id = null): bool
|
||||||
|
{
|
||||||
|
$profile_id = $this->lookup($uri, $class);
|
||||||
|
|
||||||
|
if ($profile_id == null && $this->lrdd) {
|
||||||
|
// Force lookup with online resources
|
||||||
|
// TODO: Add settings to control whether we do this or not
|
||||||
|
$profile_id = $this->lookup($uri, $class, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ($profile_id == null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A new remote profile was sucessfully added, delete
|
||||||
|
* other remotes associated with the same Profile entity.
|
||||||
|
*
|
||||||
|
* @param string $class profile class that triggered this event
|
||||||
|
* @param int $profile_id Profile:id associated with the new remote profile
|
||||||
|
* @return bool hook flag
|
||||||
|
*/
|
||||||
|
public function onEndTFNLookup(string $class, int $profile_id): bool
|
||||||
|
{
|
||||||
|
foreach ($this->free_network as $cls) {
|
||||||
|
if ($cls != $class) {
|
||||||
|
$profile = $cls::getKV('profile_id', $profile_id);
|
||||||
|
if ($profile instanceof $cls) {
|
||||||
|
$this->log(LOG_INFO, 'Deleting remote ' . $cls . ' associated with Profile:' . $profile_id);
|
||||||
|
$i = new $cls();
|
||||||
|
$i->profile_id = $profile_id;
|
||||||
|
$i->delete();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Plugin version information
|
* Plugin version information
|
||||||
*
|
*
|
||||||
@ -73,4 +128,47 @@ class TheFreeNetworkModule extends Module
|
|||||||
];
|
];
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
/**
|
||||||
|
* Search remote profile tables to find someone by URI.
|
||||||
|
* When set to search online, it will grab the remote
|
||||||
|
* entity's aliases and search with each one.
|
||||||
|
* The table associated with the class that triggered
|
||||||
|
* this lookup process will be discarded in the search.
|
||||||
|
*
|
||||||
|
* @param string $uri
|
||||||
|
* @param string $class
|
||||||
|
* @param bool $online
|
||||||
|
* @return int|null Profile:id associated with the remote entity found
|
||||||
|
*/
|
||||||
|
private function lookup(string $uri, string $class, bool $online = false): ?int
|
||||||
|
{
|
||||||
|
if ($online) {
|
||||||
|
$this->log(LOG_INFO, 'Searching with online resources for a remote profile with URI: ' . $uri);
|
||||||
|
$all_ids = LRDDPlugin::grab_profile_aliases($uri);
|
||||||
|
} else {
|
||||||
|
$this->log(LOG_INFO, 'Searching for a remote profile with URI: ' . $uri);
|
||||||
|
$all_ids = [$uri];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($all_ids == null) {
|
||||||
|
$this->log(LOG_INFO, 'Unable to find a remote profile with URI: ' . $uri);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($this->free_network as $cls) {
|
||||||
|
if ($cls != $class) {
|
||||||
|
foreach ($all_ids as $alias) {
|
||||||
|
$profile = $cls::getKV('uri', $alias);
|
||||||
|
if ($profile instanceof $cls) {
|
||||||
|
$this->log(LOG_INFO, 'Found a remote ' . $cls . ' associated with Profile:' . $profile->getID());
|
||||||
|
return $profile->getID();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->log(LOG_INFO, 'Unable to find a remote profile with URI: ' . $uri);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user