From aec6e2f97e26b716d4b0744ad8705eb1cf5a7496 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 2 Oct 2021 16:47:38 -0400 Subject: [PATCH 1/3] [twitter] Refactor common API calls on contacts --- twitter/twitter.php | 38 ++++++++++++++------------------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/twitter/twitter.php b/twitter/twitter.php index 27af0f9f..210f0fa9 100644 --- a/twitter/twitter.php +++ b/twitter/twitter.php @@ -157,19 +157,7 @@ function twitter_follow(App $a, array &$contact) $uid = $a->getLoggedInUserId(); - $ckey = DI::config()->get('twitter', 'consumerkey'); - $csecret = DI::config()->get('twitter', 'consumersecret'); - $otoken = DI::pConfig()->get($uid, 'twitter', 'oauthtoken'); - $osecret = DI::pConfig()->get($uid, 'twitter', 'oauthsecret'); - - // If the addon is not configured (general or for this user) quit here - if (empty($ckey) || empty($csecret) || empty($otoken) || empty($osecret)) { - $contact = false; - return; - } - - $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret); - $connection->post('friendships/create', ['screen_name' => $nickname]); + twitter_api_contact('friendships/create', ['network' => Protocol::TWITTER, 'nick' => $nickname], $uid); $user = twitter_fetchuser($nickname); @@ -184,12 +172,14 @@ function twitter_follow(App $a, array &$contact) function twitter_unfollow(App $a, array &$hook_data) { - $contact = $hook_data['contact']; - if ($contact['network'] !== Protocol::TWITTER) { - return; - } + $hook_data['result'] = twitter_api_contact('friendship/destroy', $hook_data['contact'], $hook_data['uid']); +} - $uid = $a->getLoggedInUserId(); +function twitter_api_contact(string $apiPath, array $contact, int $uid): ?bool +{ + if ($contact['network'] !== Protocol::TWITTER) { + return null; + } $ckey = DI::config()->get('twitter', 'consumerkey'); $csecret = DI::config()->get('twitter', 'consumersecret'); @@ -198,17 +188,17 @@ function twitter_unfollow(App $a, array &$hook_data) // If the addon is not configured (general or for this user) quit here if (empty($ckey) || empty($csecret) || empty($otoken) || empty($osecret)) { - return; + return null; } try { $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret); - $result = $connection->post('friendships/destroy', ['screen_name' => $contact['nick']]); - Logger::info('[twitter] API call "friendship/destroy" successful', ['result' => $result]); - $hook_data['result'] = true; + $result = $connection->post($apiPath, ['screen_name' => $contact['nick']]); + Logger::info('[twitter] API call successful', ['apiPath' => $apiPath, 'result' => $result]); + return true; } catch (Exception $e) { - Logger::notice('[twitter] API call "friendships/destroy" failed', ['uid' => $uid, 'url' => $contact['url'], 'exception' => $e]); - $hook_data['result'] = false; + Logger::notice('[twitter] API call failed', ['apiPath' => $apiPath, 'uid' => $uid, 'url' => $contact['url'], 'exception' => $e]); + return false; } } From dc04c0cfc497bb76ba903739def69aeb4c7d4bab Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 2 Oct 2021 16:48:23 -0400 Subject: [PATCH 2/3] [twitter] Refactor common API calls on posts - Re-activate post deletion API calls --- twitter/twitter.php | 55 +++++++++++++-------------------------------- 1 file changed, 16 insertions(+), 39 deletions(-) diff --git a/twitter/twitter.php b/twitter/twitter.php index 210f0fa9..7ce988b5 100644 --- a/twitter/twitter.php +++ b/twitter/twitter.php @@ -510,7 +510,7 @@ function twitter_probe_detect(App $a, array &$hookData) } } -function twitter_action(App $a, $uid, $pid, $action) +function twitter_api_post(string $apiPath, string $pid, int $uid) { if (empty($pid)) { return; @@ -525,34 +525,21 @@ function twitter_action(App $a, $uid, $pid, $action) $post = ['id' => $pid]; - Logger::debug('before action', ['action' => $action, 'pid' => $pid, 'data' => $post]); - $result = []; + Logger::debug('before action', ['action' => $apiPath, 'pid' => $pid, 'data' => $post]); try { - switch ($action) { - case 'delete': - // To-Do: $result = $connection->post('statuses/destroy', $post); - break; - case 'like': - $result = $connection->post('favorites/create', $post); - if ($connection->getLastHttpCode() != 200) { - Logger::warning('Unable to create favorite', ['result' => $result]); - } - break; - case 'unlike': - $result = $connection->post('favorites/destroy', $post); - if ($connection->getLastHttpCode() != 200) { - Logger::warning('Unable to destroy favorite', ['result' => $result]); - } - break; - default: - Logger::warning('Unhandled action', ['action' => $action]); + $result = $connection->post($apiPath, $post); + if ($connection->getLastHttpCode() != 200) { + Logger::warning('[twitter] API call unsuccessful', ['apiPath' => $apiPath, 'post' => $post, 'result' => $result]); } } catch (TwitterOAuthException $twitterOAuthException) { - Logger::warning('Unable to communicate with twitter', ['action' => $action, 'data' => $post, 'code' => $twitterOAuthException->getCode(), 'exception' => $twitterOAuthException]); + Logger::warning('Unable to communicate with twitter', ['apiPath' => $apiPath, 'data' => $post, 'code' => $twitterOAuthException->getCode(), 'exception' => $twitterOAuthException]); + $result = false; } - Logger::info('after action', ['action' => $action, 'result' => $result]); + Logger::info('after action', ['action' => $apiPath, 'result' => $result]); + + return $result; } function twitter_get_id(string $uri) @@ -624,16 +611,13 @@ function twitter_post_hook(App $a, array &$b) } if (($b['verb'] == Activity::POST) && $b['deleted']) { - twitter_action($a, $b['uid'], twitter_get_id($thr_parent['uri']), 'delete'); + twitter_api_post('statuses/destroy', twitter_get_id($thr_parent['uri']), $b['uid']); } if ($b['verb'] == Activity::LIKE) { Logger::info('Like', ['uid' => $b['uid'], 'id' => twitter_get_id($b["thr-parent"])]); - if ($b['deleted']) { - twitter_action($a, $b["uid"], twitter_get_id($b["thr-parent"]), "unlike"); - } else { - twitter_action($a, $b["uid"], twitter_get_id($b["thr-parent"]), "like"); - } + + twitter_api_post($b['deleted'] ? 'favorite/destroy' : 'favorite/create', twitter_get_id($b["thr-parent"]), $b["uid"]); return; } @@ -641,7 +625,7 @@ function twitter_post_hook(App $a, array &$b) if ($b['verb'] == Activity::ANNOUNCE) { Logger::info('Retweet', ['uid' => $b['uid'], 'id' => twitter_get_id($b["thr-parent"])]); if ($b['deleted']) { - twitter_action($a, $b['uid'], twitter_get_id($thr_parent['extid']), 'delete'); + twitter_api_post('statuses/destroy', twitter_get_id($thr_parent['extid']), $b['uid']); } else { twitter_retweet($b["uid"], twitter_get_id($b["thr-parent"])); } @@ -769,8 +753,7 @@ function twitter_post_hook(App $a, array &$b) $post['in_reply_to_status_id'] = twitter_get_id($thr_parent['uri']); } - $url = 'statuses/update'; - $result = $connection->post($url, $post); + $result = $connection->post('statuses/update', $post); Logger::info('twitter_post send', ['id' => $b['id'], 'result' => $result]); if (!empty($result->source)) { @@ -2145,13 +2128,7 @@ function twitter_retweet(int $uid, int $id, int $item_id = 0) { Logger::info('Retweeting', ['user' => $uid, 'id' => $id]); - $ckey = DI::config()->get('twitter', 'consumerkey'); - $csecret = DI::config()->get('twitter', 'consumersecret'); - $otoken = DI::pConfig()->get($uid, 'twitter', 'oauthtoken'); - $osecret = DI::pConfig()->get($uid, 'twitter', 'oauthsecret'); - - $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret); - $result = $connection->post('statuses/retweet/' . $id); + $result = twitter_api_post('statuses/retweet', $id, $uid); Logger::info('Retweeted', ['user' => $uid, 'id' => $id, 'result' => $result]); From 8de6454c8cdbff0788fe6c860c69f30c3f6c437d Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 2 Oct 2021 16:48:55 -0400 Subject: [PATCH 3/3] [twitter] Add support for block and unblock hooks --- twitter/twitter.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/twitter/twitter.php b/twitter/twitter.php index 7ce988b5..f65a63f3 100644 --- a/twitter/twitter.php +++ b/twitter/twitter.php @@ -107,6 +107,8 @@ function twitter_install() Hook::register('support_follow' , __FILE__, 'twitter_support_follow'); Hook::register('follow' , __FILE__, 'twitter_follow'); Hook::register('unfollow' , __FILE__, 'twitter_unfollow'); + Hook::register('block' , __FILE__, 'twitter_block'); + Hook::register('unblock' , __FILE__, 'twitter_unblock'); Hook::register('expire' , __FILE__, 'twitter_expire'); Hook::register('prepare_body' , __FILE__, 'twitter_prepare_body'); Hook::register('check_item_notification', __FILE__, 'twitter_check_item_notification'); @@ -175,6 +177,16 @@ function twitter_unfollow(App $a, array &$hook_data) $hook_data['result'] = twitter_api_contact('friendship/destroy', $hook_data['contact'], $hook_data['uid']); } +function twitter_block(App $a, array &$hook_data) +{ + $hook_data['result'] = twitter_api_contact('blocks/create', $hook_data['contact'], $hook_data['uid']); +} + +function twitter_unblock(App $a, array &$hook_data) +{ + $hook_data['result'] = twitter_api_contact('blocks/destroy', $hook_data['contact'], $hook_data['uid']); +} + function twitter_api_contact(string $apiPath, array $contact, int $uid): ?bool { if ($contact['network'] !== Protocol::TWITTER) {