X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=pumpio%2Fpumpio.php;h=8731e251390616a023aa38faf45f9044a710962c;hb=5d8e4bf73d5b86a100e79dbc86d41de2c6f207bf;hp=0b7b7facee8bb6d4a86cba3ae777c940e37416d4;hpb=807a9bf383fc05dba070519fc630c91a32d1a87d;p=friendica-addons.git diff --git a/pumpio/pumpio.php b/pumpio/pumpio.php index 0b7b7fac..8731e251 100644 --- a/pumpio/pumpio.php +++ b/pumpio/pumpio.php @@ -9,8 +9,8 @@ use Friendica\App; use Friendica\Content\Text\BBCode; use Friendica\Content\Text\HTML; -use Friendica\Core\Addon; use Friendica\Core\Config; +use Friendica\Core\Hook; use Friendica\Core\L10n; use Friendica\Core\Logger; use Friendica\Core\PConfig; @@ -18,45 +18,45 @@ use Friendica\Core\Protocol; use Friendica\Core\Worker; use Friendica\Database\DBA; use Friendica\Model\Contact; -use Friendica\Model\GContact; use Friendica\Model\Group; use Friendica\Model\Item; -use Friendica\Model\Queue; use Friendica\Model\User; +use Friendica\Util\ConfigFileLoader; use Friendica\Util\DateTimeFormat; use Friendica\Util\Network; +use Friendica\Util\Strings; +use Friendica\Util\XML; require 'addon/pumpio/oauth/http.php'; require 'addon/pumpio/oauth/oauth_client.php'; -require_once 'include/enotify.php'; require_once "mod/share.php"; define('PUMPIO_DEFAULT_POLL_INTERVAL', 5); // given in minutes function pumpio_install() { - Addon::registerHook('load_config', 'addon/pumpio/pumpio.php', 'pumpio_load_config'); - Addon::registerHook('post_local', 'addon/pumpio/pumpio.php', 'pumpio_post_local'); - Addon::registerHook('notifier_normal', 'addon/pumpio/pumpio.php', 'pumpio_send'); - Addon::registerHook('jot_networks', 'addon/pumpio/pumpio.php', 'pumpio_jot_nets'); - Addon::registerHook('connector_settings', 'addon/pumpio/pumpio.php', 'pumpio_settings'); - Addon::registerHook('connector_settings_post', 'addon/pumpio/pumpio.php', 'pumpio_settings_post'); - Addon::registerHook('cron', 'addon/pumpio/pumpio.php', 'pumpio_cron'); - Addon::registerHook('queue_predeliver', 'addon/pumpio/pumpio.php', 'pumpio_queue_hook'); - Addon::registerHook('check_item_notification', 'addon/pumpio/pumpio.php', 'pumpio_check_item_notification'); + Hook::register('load_config', 'addon/pumpio/pumpio.php', 'pumpio_load_config'); + Hook::register('hook_fork', 'addon/pumpio/pumpio.php', 'hook_fork'); + Hook::register('post_local', 'addon/pumpio/pumpio.php', 'pumpio_post_local'); + Hook::register('notifier_normal', 'addon/pumpio/pumpio.php', 'pumpio_send'); + Hook::register('jot_networks', 'addon/pumpio/pumpio.php', 'pumpio_jot_nets'); + Hook::register('connector_settings', 'addon/pumpio/pumpio.php', 'pumpio_settings'); + Hook::register('connector_settings_post', 'addon/pumpio/pumpio.php', 'pumpio_settings_post'); + Hook::register('cron', 'addon/pumpio/pumpio.php', 'pumpio_cron'); + Hook::register('check_item_notification', 'addon/pumpio/pumpio.php', 'pumpio_check_item_notification'); } function pumpio_uninstall() { - Addon::unregisterHook('load_config', 'addon/pumpio/pumpio.php', 'pumpio_load_config'); - Addon::unregisterHook('post_local', 'addon/pumpio/pumpio.php', 'pumpio_post_local'); - Addon::unregisterHook('notifier_normal', 'addon/pumpio/pumpio.php', 'pumpio_send'); - Addon::unregisterHook('jot_networks', 'addon/pumpio/pumpio.php', 'pumpio_jot_nets'); - Addon::unregisterHook('connector_settings', 'addon/pumpio/pumpio.php', 'pumpio_settings'); - Addon::unregisterHook('connector_settings_post', 'addon/pumpio/pumpio.php', 'pumpio_settings_post'); - Addon::unregisterHook('cron', 'addon/pumpio/pumpio.php', 'pumpio_cron'); - Addon::unregisterHook('queue_predeliver', 'addon/pumpio/pumpio.php', 'pumpio_queue_hook'); - Addon::unregisterHook('check_item_notification', 'addon/pumpio/pumpio.php', 'pumpio_check_item_notification'); + Hook::unregister('load_config', 'addon/pumpio/pumpio.php', 'pumpio_load_config'); + Hook::unregister('hook_fork', 'addon/pumpio/pumpio.php', 'pumpio_hook_fork'); + Hook::unregister('post_local', 'addon/pumpio/pumpio.php', 'pumpio_post_local'); + Hook::unregister('notifier_normal', 'addon/pumpio/pumpio.php', 'pumpio_send'); + Hook::unregister('jot_networks', 'addon/pumpio/pumpio.php', 'pumpio_jot_nets'); + Hook::unregister('connector_settings', 'addon/pumpio/pumpio.php', 'pumpio_settings'); + Hook::unregister('connector_settings_post', 'addon/pumpio/pumpio.php', 'pumpio_settings_post'); + Hook::unregister('cron', 'addon/pumpio/pumpio.php', 'pumpio_cron'); + Hook::unregister('check_item_notification', 'addon/pumpio/pumpio.php', 'pumpio_check_item_notification'); } function pumpio_module() {} @@ -210,19 +210,21 @@ function pumpio_connect(App $a) return $o; } -function pumpio_jot_nets(App $a, &$b) +function pumpio_jot_nets(App $a, array &$jotnets_fields) { if (! local_user()) { return; } - $pumpio_post = PConfig::get(local_user(), 'pumpio', 'post'); - - if (intval($pumpio_post) == 1) { - $pumpio_defpost = PConfig::get(local_user(), 'pumpio', 'post_by_default'); - $selected = ((intval($pumpio_defpost) == 1) ? ' checked="checked" ' : ''); - $b .= '
' - . L10n::t('Post to pumpio') . '
'; + if (PConfig::get(local_user(), 'pumpio', 'post')) { + $jotnets_fields[] = [ + 'type' => 'checkbox', + 'field' => [ + 'pumpio_enable', + L10n::t('Post to pumpio'), + PConfig::get(local_user(), 'pumpio', 'post_by_default') + ] + ]; } } @@ -374,9 +376,45 @@ function pumpio_settings_post(App $a, array &$b) } } -function pumpio_load_config(App $a) +function pumpio_load_config(App $a, ConfigFileLoader $loader) +{ + $a->getConfigCache()->load($loader->loadAddonConfig('pumpio')); +} + +function pumpio_hook_fork(App $a, array &$b) { - $a->loadConfigFile(__DIR__. '/config/pumpio.ini.php'); + if ($b['name'] != 'notifier_normal') { + return; + } + + $post = $b['data']; + + // Deleting and editing is not supported by the addon (deleting could, but isn't by now) + if ($post['deleted'] || ($post['created'] !== $post['edited'])) { + $b['execute'] = false; + return; + } + + // if post comes from pump.io don't send it back + if ($post['app'] == "pump.io") { + $b['execute'] = false; + return; + } + + if (PConfig::get($post['uid'], 'pumpio', 'import')) { + // Don't fork if it isn't a reply to a pump.io post + if (($post['parent'] != $post['id']) && !Item::exists(['id' => $post['parent'], 'network' => Protocol::PUMPIO])) { + Logger::log('No pump.io parent found for item ' . $post['id']); + $b['execute'] = false; + return; + } + } else { + // Comments are never exported when we don't import the pumpio timeline + if (!strstr($post['postopts'], 'pumpio') || ($post['parent'] != $post['id']) || $post['private']) { + $b['execute'] = false; + return; + } + } } function pumpio_post_local(App $a, array &$b) @@ -567,16 +605,7 @@ function pumpio_send(App $a, array &$b) } } else { Logger::log('pumpio_send '.$username.': '.$url.' general error: ' . print_r($user, true)); - - $r = q("SELECT `id` FROM `contact` WHERE `uid` = %d AND `self`", $b['uid']); - if (DBA::isResult($r)) { - $a->contact = $r[0]["id"]; - } - - $s = serialize(['url' => $url, 'item' => $b['id'], 'post' => $params]); - - Queue::add($a->contact, Protocol::PUMPIO, $s); - notice(L10n::t('Pump.io post failed. Queued for retry.').EOL); + Worker::defer(); } } } @@ -644,16 +673,7 @@ function pumpio_action(App $a, $uid, $uri, $action, $content = "") Logger::log('pumpio_action '.$username.' '.$action.': success '.$uri); } else { Logger::log('pumpio_action '.$username.' '.$action.': general error: '.$uri.' '.print_r($user, true)); - - $r = q("SELECT `id` FROM `contact` WHERE `uid` = %d AND `self`", $uid); - if (DBA::isResult($r)) { - $a->contact = $r[0]["id"]; - } - - $s = serialize(['url' => $url, 'item' => $orig_post["id"], 'post' => $params]); - - Queue::add($a->contact, Protocol::PUMPIO, $s); - notice(L10n::t('Pump.io like failed. Queued for retry.').EOL); + Worker::defer(); } } @@ -877,11 +897,11 @@ function pumpio_dounlike(App $a, $uid, $self, $post, $own_id) $contactid = 0; - if (link_compare($post->actor->url, $own_id)) { + if (Strings::compareLink($post->actor->url, $own_id)) { $contactid = $self[0]['id']; } else { $r = q("SELECT * FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d AND `blocked` = 0 AND `readonly` = 0 LIMIT 1", - DBA::escape(normalise_link($post->actor->url)), + DBA::escape(Strings::normaliseLink($post->actor->url)), intval($uid) ); @@ -929,14 +949,14 @@ function pumpio_dolike(App $a, $uid, $self, $post, $own_id, $threadcompletion = $contactid = 0; - if (link_compare($post->actor->url, $own_id)) { + if (Strings::compareLink($post->actor->url, $own_id)) { $contactid = $self[0]['id']; $post->actor->displayName = $self[0]['name']; $post->actor->url = $self[0]['url']; $post->actor->image->url = $self[0]['photo']; } else { $r = q("SELECT * FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d AND `blocked` = 0 AND `readonly` = 0 LIMIT 1", - DBA::escape(normalise_link($post->actor->url)), + DBA::escape(Strings::normaliseLink($post->actor->url)), intval($uid) ); @@ -981,7 +1001,7 @@ function pumpio_dolike(App $a, $uid, $self, $post, $own_id, $threadcompletion = $likedata['body'] = L10n::t('%1$s likes %2$s\'s %3$s', $author, $objauthor, $plink); $likedata['object'] = '' . ACTIVITY_OBJ_NOTE . '1' . - '' . $orig_post['uri'] . '' . xmlify('') . '' . $orig_post['title'] . '' . $orig_post['body'] . ''; + '' . $orig_post['uri'] . '' . XML::escape('') . '' . $orig_post['title'] . '' . $orig_post['body'] . ''; $ret = Item::insert($likedata); @@ -990,24 +1010,6 @@ function pumpio_dolike(App $a, $uid, $self, $post, $own_id, $threadcompletion = function pumpio_get_contact($uid, $contact, $no_insert = false) { - $gcontact = ["url" => $contact->url, "network" => Protocol::PUMPIO, "generation" => 2, - "name" => $contact->displayName, "hide" => true, - "nick" => $contact->preferredUsername, - "addr" => str_replace("acct:", "", $contact->id)]; - - if (!empty($contact->location->displayName)) { - $gcontact["location"] = $contact->location->displayName; - } - - if (!empty($contact->summary)) { - $gcontact["about"] = $contact->summary; - } - - if (!empty($contact->image->url)) { - $gcontact["photo"] = $contact->image->url; - } - - GContact::update($gcontact); $cid = Contact::getIdForURL($contact->url, $uid); if ($no_insert) { @@ -1015,7 +1017,7 @@ function pumpio_get_contact($uid, $contact, $no_insert = false) } $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' LIMIT 1", - intval($uid), DBA::escape(normalise_link($contact->url))); + intval($uid), DBA::escape(Strings::normaliseLink($contact->url))); if (!DBA::isResult($r)) { // create contact record @@ -1026,7 +1028,7 @@ function pumpio_get_contact($uid, $contact, $no_insert = false) intval($uid), DBA::escape(DateTimeFormat::utcNow()), DBA::escape($contact->url), - DBA::escape(normalise_link($contact->url)), + DBA::escape(Strings::normaliseLink($contact->url)), DBA::escape(str_replace("acct:", "", $contact->id)), DBA::escape(''), DBA::escape($contact->id), // What is it for? @@ -1043,7 +1045,7 @@ function pumpio_get_contact($uid, $contact, $no_insert = false) ); $r = q("SELECT * FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d LIMIT 1", - DBA::escape(normalise_link($contact->url)), + DBA::escape(Strings::normaliseLink($contact->url)), intval($uid) ); @@ -1163,7 +1165,7 @@ function pumpio_dopost(App $a, $client, $uid, $self, $post, $own_id, $threadcomp } else { $contact_id = pumpio_get_contact($uid, $post->actor, true); - if (link_compare($post->actor->url, $own_id)) { + if (Strings::compareLink($post->actor->url, $own_id)) { $contact_id = $self[0]['id']; $post->actor->displayName = $self[0]['name']; $post->actor->url = $self[0]['url']; @@ -1171,7 +1173,7 @@ function pumpio_dopost(App $a, $client, $uid, $self, $post, $own_id, $threadcomp } elseif ($contact_id == 0) { // Take an existing contact, the contact of the note or - as a fallback - the id of the user $r = q("SELECT * FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d AND `blocked` = 0 AND `readonly` = 0 LIMIT 1", - DBA::escape(normalise_link($post->actor->url)), + DBA::escape(Strings::normaliseLink($post->actor->url)), intval($uid) ); @@ -1179,7 +1181,7 @@ function pumpio_dopost(App $a, $client, $uid, $self, $post, $own_id, $threadcomp $contact_id = $r[0]['id']; } else { $r = q("SELECT * FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d AND `blocked` = 0 AND `readonly` = 0 LIMIT 1", - DBA::escape(normalise_link($post->actor->url)), + DBA::escape(Strings::normaliseLink($post->actor->url)), intval($uid) ); @@ -1352,7 +1354,7 @@ function pumpio_fetchinbox(App $a, $uid) return; } - if ($user->items) { + if (!empty($user->items)) { $posts = array_reverse($user->items); if (count($posts)) { @@ -1418,90 +1420,6 @@ function pumpio_getallusers(App &$a, $uid) } } -function pumpio_queue_hook(App $a, array &$b) -{ - $qi = q("SELECT * FROM `queue` WHERE `network` = '%s'", - DBA::escape(Protocol::PUMPIO) - ); - - if (!DBA::isResult($qi)) { - return; - } - - foreach ($qi as $x) { - if ($x['network'] !== Protocol::PUMPIO) { - continue; - } - - Logger::log('pumpio_queue: run'); - - $r = q("SELECT `user`.* FROM `user` LEFT JOIN `contact` ON `contact`.`uid` = `user`.`uid` - WHERE `contact`.`self` = 1 AND `contact`.`id` = %d LIMIT 1", - intval($x['cid']) - ); - if (!DBA::isResult($r)) { - continue; - } - - $userdata = $r[0]; - - //Logger::log('pumpio_queue: fetching userdata '.print_r($userdata, true)); - - $oauth_token = PConfig::get($userdata['uid'], "pumpio", "oauth_token"); - $oauth_token_secret = PConfig::get($userdata['uid'], "pumpio", "oauth_token_secret"); - $consumer_key = PConfig::get($userdata['uid'], "pumpio", "consumer_key"); - $consumer_secret = PConfig::get($userdata['uid'], "pumpio", "consumer_secret"); - - $host = PConfig::get($userdata['uid'], "pumpio", "host"); - $user = PConfig::get($userdata['uid'], "pumpio", "user"); - - $success = false; - - if ($oauth_token && $oauth_token_secret && - $consumer_key && $consumer_secret) { - $username = $user.'@'.$host; - - Logger::log('pumpio_queue: able to post for user '.$username); - - $z = unserialize($x['content']); - - $client = new oauth_client_class; - $client->oauth_version = '1.0a'; - $client->url_parameters = false; - $client->authorization_header = true; - $client->access_token = $oauth_token; - $client->access_token_secret = $oauth_token_secret; - $client->client_id = $consumer_key; - $client->client_secret = $consumer_secret; - - if (pumpio_reachable($z['url'])) { - $success = $client->CallAPI($z['url'], 'POST', $z['post'], ['FailOnAccessError'=>true, 'RequestContentType'=>'application/json'], $user); - } else { - $success = false; - } - - if ($success) { - $post_id = $user->object->id; - Logger::log('pumpio_queue: send '.$username.': success '.$post_id); - if ($post_id && $iscomment) { - Logger::log('pumpio_send '.$username.': Update extid '.$post_id." for post id ".$z['item']); - Item::update(['extid' => $post_id], ['id' => $z['item']]); - } - Queue::removeItem($x['id']); - } else { - Logger::log('pumpio_queue: send '.$username.': '.$z['url'].' general error: ' . print_r($user, true)); - } - } else { - Logger::log("pumpio_queue: Error getting tokens for user ".$userdata['uid']); - } - - if (!$success) { - Logger::log('pumpio_queue: delayed'); - Queue::updateTime($x['id']); - } - } -} - function pumpio_getreceiver(App $a, array $b) { $receiver = []; @@ -1692,7 +1610,7 @@ function pumpio_fetchallcomments(App $a, $uid, $id) function pumpio_reachable($url) { - return Network::curl($url, false, $redirects, ['timeout'=>10])->isSuccess(); + return Network::curl($url, false, ['timeout' => 10])->isSuccess(); } /*