Merge pull request #539 from MrPetovan/bug/4555-remove-active-users-feature
[friendica-addons.git] / statusnet / statusnet.php
index 40239af714463922547d7b7e524666192100f9dc..c54ff55f6c923ce65d4b4e3051bf2d770144884c 100644 (file)
  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  */
-/*
- * We have to alter the TwitterOAuth class a little bit to work with any GNU Social
- * installation abroad. Basically it's only make the API path variable and be happy.
- *
- * Thank you guys for the Twitter compatible API!
- */
-
 define('STATUSNET_DEFAULT_POLL_INTERVAL', 5); // given in minutes
 
-require_once 'library/twitteroauth.php';
+require_once __DIR__ . DIRECTORY_SEPARATOR . 'library' . DIRECTORY_SEPARATOR . 'statusnetoauth.php';
 require_once 'include/enotify.php';
 
+use Codebird\Codebird;
+use CodebirdSN\CodebirdSN;
 use Friendica\App;
 use Friendica\Content\OEmbed;
 use Friendica\Content\Text\BBCode;
+use Friendica\Content\Text\Plaintext;
 use Friendica\Core\Addon;
 use Friendica\Core\Config;
 use Friendica\Core\L10n;
 use Friendica\Core\PConfig;
 use Friendica\Model\GContact;
 use Friendica\Model\Group;
+use Friendica\Model\Item;
 use Friendica\Model\Photo;
 use Friendica\Model\User;
-
-class StatusNetOAuth extends TwitterOAuth
-{
-       function get_maxlength()
-       {
-               $config = $this->get($this->host . 'statusnet/config.json');
-               return $config->site->textlimit;
-       }
-
-       function accessTokenURL()
-       {
-               return $this->host . 'oauth/access_token';
-       }
-
-       function authenticateURL()
-       {
-               return $this->host . 'oauth/authenticate';
-       }
-
-       function authorizeURL()
-       {
-               return $this->host . 'oauth/authorize';
-       }
-
-       function requestTokenURL()
-       {
-               return $this->host . 'oauth/request_token';
-       }
-
-       function __construct($apipath, $consumer_key, $consumer_secret, $oauth_token = NULL, $oauth_token_secret = NULL)
-       {
-               parent::__construct($consumer_key, $consumer_secret, $oauth_token, $oauth_token_secret);
-               $this->host = $apipath;
-       }
-
-       /**
-        * Make an HTTP request
-        *
-        * @return API results
-        *
-        * Copied here from the twitteroauth library and complemented by applying the proxy settings of friendica
-        */
-       function http($url, $method, $postfields = NULL)
-       {
-               $this->http_info = [];
-               $ci = curl_init();
-               /* Curl settings */
-               $prx = Config::get('system', 'proxy');
-               if (strlen($prx)) {
-                       curl_setopt($ci, CURLOPT_HTTPPROXYTUNNEL, 1);
-                       curl_setopt($ci, CURLOPT_PROXY, $prx);
-                       $prxusr = Config::get('system', 'proxyuser');
-                       if (strlen($prxusr)) {
-                               curl_setopt($ci, CURLOPT_PROXYUSERPWD, $prxusr);
-                       }
-               }
-               curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent);
-               curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout);
-               curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout);
-               curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);
-               curl_setopt($ci, CURLOPT_HTTPHEADER, ['Expect:']);
-               curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);
-               curl_setopt($ci, CURLOPT_HEADERFUNCTION, [$this, 'getHeader']);
-               curl_setopt($ci, CURLOPT_HEADER, FALSE);
-
-               switch ($method) {
-                       case 'POST':
-                               curl_setopt($ci, CURLOPT_POST, TRUE);
-                               if (!empty($postfields)) {
-                                       curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
-                               }
-                               break;
-                       case 'DELETE':
-                               curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE');
-                               if (!empty($postfields)) {
-                                       $url = "{$url}?{$postfields}";
-                               }
-               }
-
-               curl_setopt($ci, CURLOPT_URL, $url);
-               $response = curl_exec($ci);
-               $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
-               $this->http_info = array_merge($this->http_info, curl_getinfo($ci));
-               $this->url = $url;
-               curl_close($ci);
-               return $response;
-       }
-}
+use Friendica\Util\DateTimeFormat;
+use Friendica\Util\Network;
 
 function statusnet_install()
 {
@@ -233,7 +144,7 @@ function statusnet_settings_post(App $a, $post)
                        foreach ($globalsn as $asn) {
                                if ($asn['apiurl'] == $_POST['statusnet-preconf-apiurl']) {
                                        $apibase = $asn['apiurl'];
-                                       $c = fetch_url($apibase . 'statusnet/version.xml');
+                                       $c = Network::fetchUrl($apibase . 'statusnet/version.xml');
                                        if (strlen($c) > 0) {
                                                PConfig::set(local_user(), 'statusnet', 'consumerkey', $asn['consumerkey']);
                                                PConfig::set(local_user(), 'statusnet', 'consumersecret', $asn['consumersecret']);
@@ -251,7 +162,7 @@ function statusnet_settings_post(App $a, $post)
                                //  we'll check the API Version for that, if we don't get one we'll try to fix the path but will
                                //  resign quickly after this one try to fix the path ;-)
                                $apibase = $_POST['statusnet-baseapi'];
-                               $c = fetch_url($apibase . 'statusnet/version.xml');
+                               $c = Network::fetchUrl($apibase . 'statusnet/version.xml');
                                if (strlen($c) > 0) {
                                        //  ok the API path is correct, let's save the settings
                                        PConfig::set(local_user(), 'statusnet', 'consumerkey', $_POST['statusnet-consumerkey']);
@@ -261,7 +172,7 @@ function statusnet_settings_post(App $a, $post)
                                } else {
                                        //  the API path is not correct, maybe missing trailing / ?
                                        $apibase = $apibase . '/';
-                                       $c = fetch_url($apibase . 'statusnet/version.xml');
+                                       $c = Network::fetchUrl($apibase . 'statusnet/version.xml');
                                        if (strlen($c) > 0) {
                                                //  ok the API path is now correct, let's save the settings
                                                PConfig::set(local_user(), 'statusnet', 'consumerkey', $_POST['statusnet-consumerkey']);
@@ -633,35 +544,28 @@ function statusnet_post_hook(App $a, &$b)
                        return;
                }
 
-               require_once 'include/bbcode.php';
                $dent = new StatusNetOAuth($api, $ckey, $csecret, $otoken, $osecret);
                $max_char = $dent->get_maxlength(); // max. length for a dent
 
                PConfig::set($b['uid'], 'statusnet', 'max_char', $max_char);
 
                $tempfile = "";
-               require_once "include/network.php";
                $msgarr = BBCode::toPlaintext($b, $max_char, true, 7);
                $msg = $msgarr["text"];
 
                if (($msg == "") && isset($msgarr["title"]))
-                       $msg = BBCode::shortenMsg($msgarr["title"], $max_char - 50);
+                       $msg = Plaintext::shorten($msgarr["title"], $max_char - 50);
 
                $image = "";
 
                if (isset($msgarr["url"]) && ($msgarr["type"] != "photo")) {
-                       if ((strlen($msgarr["url"]) > 20) &&
-                               ((strlen($msg . " \n" . $msgarr["url"]) > $max_char))) {
-                               $msg .= " \n" . short_link($msgarr["url"]);
-                       } else {
-                               $msg .= " \n" . $msgarr["url"];
-                       }
+                       $msg .= " \n" . $msgarr["url"];
                } elseif (isset($msgarr["image"]) && ($msgarr["type"] != "video")) {
                        $image = $msgarr["image"];
                }
 
                if ($image != "") {
-                       $img_str = fetch_url($image);
+                       $img_str = Network::fetchUrl($image);
                        $tempfile = tempnam(get_temppath(), "cache");
                        file_put_contents($tempfile, $img_str);
                        $postdata = ["status" => $msg, "media[]" => $tempfile];
@@ -669,7 +573,7 @@ function statusnet_post_hook(App $a, &$b)
                        $postdata = ["status" => $msg];
                }
 
-               // and now dent it :-)
+               // and now send it :-)
                if (strlen($msg)) {
                        if ($iscomment) {
                                $postdata["in_reply_to_status_id"] = substr($orig_post["uri"], $hostlength);
@@ -677,7 +581,7 @@ function statusnet_post_hook(App $a, &$b)
                        }
 
                        // New code that is able to post pictures
-                       require_once "addon/statusnet/codebird.php";
+                       require_once __DIR__ . DIRECTORY_SEPARATOR . 'library' . DIRECTORY_SEPARATOR . 'codebirdsn.php';
                        $cb = \CodebirdSN\CodebirdSN::getInstance();
                        $cb->setAPIEndpoint($api);
                        $cb->setConsumerKey($ckey, $csecret);
@@ -695,11 +599,7 @@ function statusnet_post_hook(App $a, &$b)
                                logger('Send to GNU Social failed: "' . $result->error . '"');
                        } elseif ($iscomment) {
                                logger('statusnet_post: Update extid ' . $result->id . " for post id " . $b['id']);
-                               q("UPDATE `item` SET `extid` = '%s', `body` = '%s' WHERE `id` = %d",
-                                       dbesc($hostname . "::" . $result->id),
-                                       dbesc($result->text),
-                                       intval($b['id'])
-                               );
+                               Item::update(['extid' => $hostname . "::" . $result->id, 'body' => $result->text], ['id' => $b['id']]);
                        }
                }
                if ($tempfile != "") {
@@ -855,7 +755,7 @@ function statusnet_cron(App $a, $b)
                $abandon_days = 0;
        }
 
-       $abandon_limit = date("Y-m-d H:i:s", time() - $abandon_days * 86400);
+       $abandon_limit = date(DateTimeFormat::MYSQL, time() - $abandon_days * 86400);
 
        $r = q("SELECT * FROM `pconfig` WHERE `cat` = 'statusnet' AND `k` = 'import' AND `v` ORDER BY RAND()");
        if (count($r)) {
@@ -1031,7 +931,7 @@ function statusnet_fetch_contact($uid, $contact, $create_user)
                                        `location`, `about`, `writable`, `blocked`, `readonly`, `pending` )
                                        VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', %d, 0, 0, 0 ) ",
                        intval($uid),
-                       dbesc(datetime_convert()),
+                       dbesc(DateTimeFormat::utcNow()),
                        dbesc($contact->statusnet_profile_url),
                        dbesc(normalise_link($contact->statusnet_profile_url)),
                        dbesc(statusnet_address($contact)),
@@ -1072,13 +972,13 @@ function statusnet_fetch_contact($uid, $contact, $create_user)
                        dbesc($photos[0]),
                        dbesc($photos[1]),
                        dbesc($photos[2]),
-                       dbesc(datetime_convert()),
+                       dbesc(DateTimeFormat::utcNow()),
                        intval($contact_id)
                );
        } else {
                // update profile photos once every two weeks as we have no notification of when they change.
-               //$update_photo = (($r[0]['avatar-date'] < datetime_convert('','','now -2 days')) ? true : false);
-               $update_photo = ($r[0]['avatar-date'] < datetime_convert('', '', 'now -12 hours'));
+               //$update_photo = (($r[0]['avatar-date'] < DateTimeFormat::convert('now -2 days', '', '', )) ? true : false);
+               $update_photo = ($r[0]['avatar-date'] < DateTimeFormat::utc('now -12 hours'));
 
                // check that we have all the photos, this has been known to fail on occasion
                if ((!$r[0]['photo']) || (!$r[0]['thumb']) || (!$r[0]['micro']) || ($update_photo)) {
@@ -1103,9 +1003,9 @@ function statusnet_fetch_contact($uid, $contact, $create_user)
                                dbesc($photos[0]),
                                dbesc($photos[1]),
                                dbesc($photos[2]),
-                               dbesc(datetime_convert()),
-                               dbesc(datetime_convert()),
-                               dbesc(datetime_convert()),
+                               dbesc(DateTimeFormat::utcNow()),
+                               dbesc(DateTimeFormat::utcNow()),
+                               dbesc(DateTimeFormat::utcNow()),
                                dbesc($contact->statusnet_profile_url),
                                dbesc(normalise_link($contact->statusnet_profile_url)),
                                dbesc(statusnet_address($contact)),
@@ -1129,9 +1029,9 @@ function statusnet_fetchuser(App $a, $uid, $screen_name = "", $user_id = "")
        $otoken  = PConfig::get($uid, 'statusnet', 'oauthtoken');
        $osecret = PConfig::get($uid, 'statusnet', 'oauthsecret');
 
-       require_once "addon/statusnet/codebird.php";
+       require_once __DIR__ . DIRECTORY_SEPARATOR . 'library' . DIRECTORY_SEPARATOR . 'codebirdsn.php';
 
-       $cb = \Codebird\Codebird::getInstance();
+       $cb = \CodebirdSN\CodebirdSN::getInstance();
        $cb->setConsumerKey($ckey, $csecret);
        $cb->setToken($otoken, $osecret);
 
@@ -1292,8 +1192,8 @@ function statusnet_createpost(App $a, $uid, $post, $self, $create_user, $only_ex
        $postarray['body'] = $converted["body"];
        $postarray['tag'] = $converted["tags"];
 
-       $postarray['created'] = datetime_convert('UTC', 'UTC', $content->created_at);
-       $postarray['edited'] = datetime_convert('UTC', 'UTC', $content->created_at);
+       $postarray['created'] = DateTimeFormat::utc($content->created_at);
+       $postarray['edited'] = DateTimeFormat::utc($content->created_at);
 
        if (is_string($content->place->name)) {
                $postarray["location"] = $content->place->name;
@@ -1370,7 +1270,7 @@ function statusnet_checknotification(App $a, $uid, $own_url, $top_item, $postarr
                                'to_email' => $user[0]['email'],
                                'uid' => $user[0]['uid'],
                                'item' => $postarray,
-                               'link' => $a->get_baseurl() . '/display/' . urlencode(get_item_guid($top_item)),
+                               'link' => $a->get_baseurl() . '/display/' . urlencode(Item::getGuidById($top_item)),
                                'source_name' => $postarray['author-name'],
                                'source_link' => $postarray['author-link'],
                                'source_photo' => $postarray['author-avatar'],
@@ -1401,7 +1301,6 @@ function statusnet_fetchhometimeline(App $a, $uid, $mode = 1)
 
        logger("statusnet_fetchhometimeline: Fetching for user " . $uid, LOGGER_DEBUG);
 
-       require_once 'library/twitteroauth.php';
        require_once 'include/items.php';
 
        $connection = new StatusNetOAuth($api, $ckey, $csecret, $otoken, $osecret);
@@ -1494,7 +1393,7 @@ function statusnet_fetchhometimeline(App $a, $uid, $mode = 1)
                                                continue;
                                        }
 
-                                       $item = item_store($postarray);
+                                       $item = Item::insert($postarray);
                                        $postarray["id"] = $item;
 
                                        logger('statusnet_fetchhometimeline: User ' . $self["nick"] . ' posted home timeline item ' . $item);
@@ -1549,7 +1448,7 @@ function statusnet_fetchhometimeline(App $a, $uid, $mode = 1)
                                        continue;
                                }
 
-                               $item = item_store($postarray);
+                               $item = Item::insert($postarray);
                                $postarray["id"] = $item;
 
                                logger('statusnet_fetchhometimeline: User ' . $self["nick"] . ' posted mention timeline item ' . $item);
@@ -1578,7 +1477,7 @@ function statusnet_fetchhometimeline(App $a, $uid, $mode = 1)
                                        'to_email'     => $u[0]['email'],
                                        'uid'          => $u[0]['uid'],
                                        'item'         => $postarray,
-                                       'link'         => $a->get_baseurl() . '/display/' . urlencode(get_item_guid($item)),
+                                       'link'         => $a->get_baseurl() . '/display/' . urlencode(Item::getGuidById($item)),
                                        'source_name'  => $postarray['author-name'],
                                        'source_link'  => $postarray['author-link'],
                                        'source_photo' => $postarray['author-avatar'],
@@ -1602,8 +1501,6 @@ function statusnet_complete_conversation(App $a, $uid, $self, $create_user, $nic
        $osecret = PConfig::get($uid, 'statusnet', 'oauthsecret');
        $own_url = PConfig::get($uid, 'statusnet', 'own_url');
 
-       require_once 'library/twitteroauth.php';
-
        $connection = new StatusNetOAuth($api, $ckey, $csecret, $otoken, $osecret);
 
        $parameters["count"] = 200;
@@ -1612,14 +1509,14 @@ function statusnet_complete_conversation(App $a, $uid, $self, $create_user, $nic
        if (is_array($items)) {
                $posts = array_reverse($items);
 
-               foreach ($posts AS $post) {
+               foreach ($posts as $post) {
                        $postarray = statusnet_createpost($a, $uid, $post, $self, false, false);
 
                        if (trim($postarray['body']) == "") {
                                continue;
                        }
 
-                       $item = item_store($postarray);
+                       $item = Item::insert($postarray);
                        $postarray["id"] = $item;
 
                        logger('statusnet_complete_conversation: User ' . $self["nick"] . ' posted home timeline item ' . $item);
@@ -1634,7 +1531,6 @@ function statusnet_complete_conversation(App $a, $uid, $self, $create_user, $nic
 function statusnet_convertmsg(App $a, $body, $no_tags = false)
 {
        require_once "include/items.php";
-       require_once "include/network.php";
 
        $body = preg_replace("=\[url\=https?://([0-9]*).([0-9]*).([0-9]*).([0-9]*)/([0-9]*)\](.*?)\[\/url\]=ism", "$1.$2.$3.$4/$5", $body);
 
@@ -1652,7 +1548,7 @@ function statusnet_convertmsg(App $a, $body, $no_tags = false)
 
                        logger("statusnet_convertmsg: expanding url " . $match[1], LOGGER_DEBUG);
 
-                       $expanded_url = original_url($match[1]);
+                       $expanded_url = Network::finalUrl($match[1]);
 
                        logger("statusnet_convertmsg: fetching data for " . $expanded_url, LOGGER_DEBUG);
 
@@ -1676,7 +1572,7 @@ function statusnet_convertmsg(App $a, $body, $no_tags = false)
                        } elseif ($oembed_data->type != "link") {
                                $body = str_replace($search, "[url=" . $expanded_url . "]" . $expanded_url . "[/url]", $body);
                        } else {
-                               $img_str = fetch_url($expanded_url, true, $redirects, 4);
+                               $img_str = Network::fetchUrl($expanded_url, true, $redirects, 4);
 
                                $tempfile = tempnam(get_temppath(), "cache");
                                file_put_contents($tempfile, $img_str);
@@ -1755,8 +1651,6 @@ function statusnet_fetch_own_contact(App $a, $uid)
        $contact_id = 0;
 
        if ($own_url == "") {
-               require_once 'library/twitteroauth.php';
-
                $connection = new StatusNetOAuth($api, $ckey, $csecret, $otoken, $osecret);
 
                // Fetching user data