-
-function statusnet_prepare_body(App $a, &$b)
-{
- if ($b["item"]["network"] != Protocol::STATUSNET) {
- return;
- }
-
- if ($b["preview"]) {
- $max_char = DI::pConfig()->get(local_user(), 'statusnet', 'max_char');
- if (intval($max_char) == 0) {
- $max_char = 140;
- }
-
- $item = $b["item"];
- $item["plink"] = DI::baseUrl()->get() . "/display/" . $item["guid"];
-
- $condition = ['uri' => $item["thr-parent"], 'uid' => local_user()];
- $orig_post = Item::selectFirst(['author-link', 'uri'], $condition);
- if (DBA::isResult($orig_post)) {
- $nick = preg_replace("=https?://(.*)/(.*)=ism", "$2", $orig_post["author-link"]);
-
- $nickname = "@[url=" . $orig_post["author-link"] . "]" . $nick . "[/url]";
- $nicknameplain = "@" . $nick;
-
- if ((strpos($item["body"], $nickname) === false) && (strpos($item["body"], $nicknameplain) === false)) {
- $item["body"] = $nickname . " " . $item["body"];
- }
- }
-
- $msgarr = ItemContent::getPlaintextPost($item, $max_char, true, 7);
- $msg = $msgarr["text"];
-
- if (isset($msgarr["url"]) && ($msgarr["type"] != "photo")) {
- $msg .= " " . $msgarr["url"];
- }
-
- if (isset($msgarr["image"])) {
- $msg .= " " . $msgarr["image"];
- }
-
- $b['html'] = nl2br(htmlspecialchars($msg));
- }
-}
-
-function statusnet_cron(App $a, $b)
-{
- $last = DI::config()->get('statusnet', 'last_poll');
-
- $poll_interval = intval(DI::config()->get('statusnet', 'poll_interval'));
- if (!$poll_interval) {
- $poll_interval = STATUSNET_DEFAULT_POLL_INTERVAL;
- }
-
- if ($last) {
- $next = $last + ($poll_interval * 60);
- if ($next > time()) {
- Logger::log('statusnet: poll intervall not reached');
- return;
- }
- }
- Logger::log('statusnet: cron_start');
-
- $r = q("SELECT * FROM `pconfig` WHERE `cat` = 'statusnet' AND `k` = 'mirror_posts' AND `v` = '1' ORDER BY RAND() ");
- if (DBA::isResult($r)) {
- foreach ($r as $rr) {
- Logger::log('statusnet: fetching for user ' . $rr['uid']);
- statusnet_fetchtimeline($a, $rr['uid']);
- }
- }
-
- $abandon_days = intval(DI::config()->get('system', 'account_abandon_days'));
- if ($abandon_days < 1) {
- $abandon_days = 0;
- }
-
- $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 (DBA::isResult($r)) {
- foreach ($r as $rr) {
- if ($abandon_days != 0) {
- $user = q("SELECT `login_date` FROM `user` WHERE uid=%d AND `login_date` >= '%s'", $rr['uid'], $abandon_limit);
- if (!DBA::isResult($user)) {
- Logger::log('abandoned account: timeline from user ' . $rr['uid'] . ' will not be imported');
- continue;
- }
- }
-
- Logger::log('statusnet: importing timeline from user ' . $rr['uid']);
- statusnet_fetchhometimeline($a, $rr["uid"], $rr["v"]);
- }
- }
-
- Logger::log('statusnet: cron_end');
-
- DI::config()->set('statusnet', 'last_poll', time());
-}
-
-function statusnet_fetchtimeline(App $a, $uid)
-{
- $ckey = DI::pConfig()->get($uid, 'statusnet', 'consumerkey');
- $csecret = DI::pConfig()->get($uid, 'statusnet', 'consumersecret');
- $api = DI::pConfig()->get($uid, 'statusnet', 'baseapi');
- $otoken = DI::pConfig()->get($uid, 'statusnet', 'oauthtoken');
- $osecret = DI::pConfig()->get($uid, 'statusnet', 'oauthsecret');
- $lastid = DI::pConfig()->get($uid, 'statusnet', 'lastid');
-
- require_once 'mod/item.php';
- // get the application name for the SN app
- // 1st try personal config, then system config and fallback to the
- // hostname of the node if neither one is set.
- $application_name = DI::pConfig()->get($uid, 'statusnet', 'application_name');
- if ($application_name == "") {
- $application_name = DI::config()->get('statusnet', 'application_name');
- }
- if ($application_name == "") {
- $application_name = DI::baseUrl()->getHostname();
- }
-
- $connection = new StatusNetOAuth($api, $ckey, $csecret, $otoken, $osecret);
-
- $parameters = ["exclude_replies" => true, "trim_user" => true, "contributor_details" => false, "include_rts" => false];
-
- $first_time = ($lastid == "");
-
- if ($lastid <> "") {
- $parameters["since_id"] = $lastid;
- }
-
- $items = $connection->get('statuses/user_timeline', $parameters);
-
- if (!is_array($items)) {
- return;
- }
-
- $posts = array_reverse($items);
-
- if (count($posts)) {
- foreach ($posts as $post) {
- if ($post->id > $lastid)
- $lastid = $post->id;
-
- if ($first_time) {
- continue;
- }
-
- if ($post->source == "activity") {
- continue;
- }
-
- if (!empty($post->retweeted_status)) {
- continue;
- }
-
- if ($post->in_reply_to_status_id != "") {
- continue;
- }
-
- if (!stristr($post->source, $application_name)) {
- $_SESSION["authenticated"] = true;
- $_SESSION["uid"] = $uid;
-
- unset($_REQUEST);
- $_REQUEST["api_source"] = true;
- $_REQUEST["profile_uid"] = $uid;
- //$_REQUEST["source"] = "StatusNet";
- $_REQUEST["source"] = $post->source;
- $_REQUEST["extid"] = Protocol::STATUSNET;
-
- if (isset($post->id)) {
- $_REQUEST['message_id'] = Item::newURI($uid, Protocol::STATUSNET . ":" . $post->id);
- }
-
- //$_REQUEST["date"] = $post->created_at;
-
- $_REQUEST["title"] = "";
-
- $_REQUEST["body"] = PageInfo::searchAndAppendToBody($post->text, true);
- if (is_string($post->place->name)) {
- $_REQUEST["location"] = $post->place->name;
- }
-
- if (is_string($post->place->full_name)) {
- $_REQUEST["location"] = $post->place->full_name;
- }
-
- if (is_array($post->geo->coordinates)) {
- $_REQUEST["coord"] = $post->geo->coordinates[0] . " " . $post->geo->coordinates[1];
- }
-
- if (is_array($post->coordinates->coordinates)) {
- $_REQUEST["coord"] = $post->coordinates->coordinates[1] . " " . $post->coordinates->coordinates[0];
- }
-
- //print_r($_REQUEST);
- if ($_REQUEST["body"] != "") {
- Logger::log('statusnet: posting for user ' . $uid);
-
- item_post($a);
- }
- }
- }
- }
- DI::pConfig()->set($uid, 'statusnet', 'lastid', $lastid);
-}
-
-function statusnet_address($contact)
-{
- $hostname = Strings::normaliseLink($contact->statusnet_profile_url);
- $nickname = $contact->screen_name;
-
- $hostname = preg_replace("=https?://([\w\.]*)/.*=ism", "$1", $contact->statusnet_profile_url);
-
- $address = $contact->screen_name . "@" . $hostname;
-
- return $address;
-}
-
-function statusnet_fetch_contact($uid, $contact, $create_user)
-{
- if (empty($contact->statusnet_profile_url)) {
- return -1;
- }
-
- $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `alias` = '%s' AND `network` = '%s'LIMIT 1", intval($uid), DBA::escape(Strings::normaliseLink($contact->statusnet_profile_url)), DBA::escape(Protocol::STATUSNET));
-
- if (!DBA::isResult($r) && !$create_user) {
- return 0;
- }
-
- if (DBA::isResult($r) && ($r[0]["readonly"] || $r[0]["blocked"])) {
- Logger::log("statusnet_fetch_contact: Contact '" . $r[0]["nick"] . "' is blocked or readonly.", Logger::DEBUG);
- return -1;
- }
-
- if (!DBA::isResult($r)) {
- // create contact record
- q("INSERT INTO `contact` ( `uid`, `created`, `url`, `nurl`, `addr`, `alias`, `notify`, `poll`,
- `name`, `nick`, `photo`, `network`, `rel`, `priority`,
- `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),
- DBA::escape(DateTimeFormat::utcNow()),
- DBA::escape($contact->statusnet_profile_url),
- DBA::escape(Strings::normaliseLink($contact->statusnet_profile_url)),
- DBA::escape(statusnet_address($contact)),
- DBA::escape(Strings::normaliseLink($contact->statusnet_profile_url)),
- DBA::escape(''),
- DBA::escape(''),
- DBA::escape($contact->name),
- DBA::escape($contact->screen_name),
- DBA::escape($contact->profile_image_url),
- DBA::escape(Protocol::STATUSNET),
- intval(Contact::FRIEND),
- intval(1),
- DBA::escape($contact->location),
- DBA::escape($contact->description),
- intval(1)
- );
-
- $r = q("SELECT * FROM `contact` WHERE `alias` = '%s' AND `uid` = %d AND `network` = '%s' LIMIT 1",
- DBA::escape($contact->statusnet_profile_url),
- intval($uid),
- DBA::escape(Protocol::STATUSNET));
-
- if (!DBA::isResult($r)) {
- return false;
- }
-
- $contact_id = $r[0]['id'];
-
- Group::addMember(User::getDefaultGroup($uid), $contact_id);
-
- $photos = Photo::importProfilePhoto($contact->profile_image_url, $uid, $contact_id);
-
- q("UPDATE `contact` SET `photo` = '%s',
- `thumb` = '%s',
- `micro` = '%s',
- `avatar-date` = '%s'
- WHERE `id` = %d",
- DBA::escape($photos[0]),
- DBA::escape($photos[1]),
- DBA::escape($photos[2]),
- DBA::escape(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'] < 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)) {
- Logger::log("statusnet_fetch_contact: Updating contact " . $contact->screen_name, Logger::DEBUG);
-
- $photos = Photo::importProfilePhoto($contact->profile_image_url, $uid, $r[0]['id']);
-
- q("UPDATE `contact` SET `photo` = '%s',
- `thumb` = '%s',
- `micro` = '%s',
- `name-date` = '%s',
- `uri-date` = '%s',
- `avatar-date` = '%s',
- `url` = '%s',
- `nurl` = '%s',
- `addr` = '%s',
- `name` = '%s',
- `nick` = '%s',
- `location` = '%s',
- `about` = '%s'
- WHERE `id` = %d",
- DBA::escape($photos[0]),
- DBA::escape($photos[1]),
- DBA::escape($photos[2]),
- DBA::escape(DateTimeFormat::utcNow()),
- DBA::escape(DateTimeFormat::utcNow()),
- DBA::escape(DateTimeFormat::utcNow()),
- DBA::escape($contact->statusnet_profile_url),
- DBA::escape(Strings::normaliseLink($contact->statusnet_profile_url)),
- DBA::escape(statusnet_address($contact)),
- DBA::escape($contact->name),
- DBA::escape($contact->screen_name),
- DBA::escape($contact->location),
- DBA::escape($contact->description),
- intval($r[0]['id'])
- );
- }
- }
-
- return $r[0]["id"];
-}
-
-function statusnet_fetchuser(App $a, $uid, $screen_name = "", $user_id = "")
-{
- $ckey = DI::pConfig()->get($uid, 'statusnet', 'consumerkey');
- $csecret = DI::pConfig()->get($uid, 'statusnet', 'consumersecret');
- $api = DI::pConfig()->get($uid, 'statusnet', 'baseapi');
- $otoken = DI::pConfig()->get($uid, 'statusnet', 'oauthtoken');
- $osecret = DI::pConfig()->get($uid, 'statusnet', 'oauthsecret');
-
- require_once __DIR__ . DIRECTORY_SEPARATOR . 'library' . DIRECTORY_SEPARATOR . 'codebirdsn.php';
-
- $cb = CodebirdSN::getInstance();
- $cb->setConsumerKey($ckey, $csecret);
- $cb->setToken($otoken, $osecret);
-
- $r = q("SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1",
- intval($uid));
-
- if (DBA::isResult($r)) {
- $self = $r[0];
- } else {
- return;
- }
-
- $parameters = [];
-
- if ($screen_name != "") {
- $parameters["screen_name"] = $screen_name;
- }
-
- if ($user_id != "") {
- $parameters["user_id"] = $user_id;
- }
-
- // Fetching user data
- $user = $cb->users_show($parameters);
-
- if (!is_object($user)) {
- return;
- }
-
- $contact_id = statusnet_fetch_contact($uid, $user, true);
-
- return $contact_id;
-}
-
-function statusnet_createpost(App $a, $uid, $post, $self, $create_user, $only_existing_contact)
-{
- Logger::log("statusnet_createpost: start", Logger::DEBUG);
-
- $api = DI::pConfig()->get($uid, 'statusnet', 'baseapi');
- $hostname = preg_replace("=https?://([\w\.]*)/.*=ism", "$1", $api);
-
- $postarray = [];
- $postarray['network'] = Protocol::STATUSNET;
- $postarray['uid'] = $uid;
- $postarray['wall'] = 0;
-
- if (!empty($post->retweeted_status)) {
- $content = $post->retweeted_status;
- statusnet_fetch_contact($uid, $content->user, false);
- } else {
- $content = $post;
- }
-
- $postarray['uri'] = $hostname . "::" . $content->id;
-
- if (Item::exists(['extid' => $postarray['uri'], 'uid' => $uid])) {
- return [];
- }
-
- $contactid = 0;
-
- if (!empty($content->in_reply_to_status_id)) {
- $thr_parent = $hostname . "::" . $content->in_reply_to_status_id;
-
- if (
- Item::exists(['uri' => $thr_parent, 'uid' => $uid])
- || Item::exists(['extid' => $thr_parent, 'uid' => $uid])
- ) {
- $postarray['thr-parent'] = $thr_parent;
- $postarray['object-type'] = Activity\ObjectType::COMMENT;
- } else {
- $postarray['object-type'] = Activity\ObjectType::NOTE;
- }
-
- // Is it me?
- $own_url = DI::pConfig()->get($uid, 'statusnet', 'own_url');
-
- if ($content->user->id == $own_url) {
- $r = q("SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1",
- intval($uid));
-
- if (DBA::isResult($r)) {
- $contactid = $r[0]["id"];
-
- $postarray['owner-name'] = $r[0]["name"];
- $postarray['owner-link'] = $r[0]["url"];
- $postarray['owner-avatar'] = $r[0]["photo"];
- } else {
- return [];
- }
- }
- // Don't create accounts of people who just comment something
- $create_user = false;
- } else {
- $postarray['object-type'] = Activity\ObjectType::NOTE;
- }
-
- if ($contactid == 0) {
- $contactid = statusnet_fetch_contact($uid, $post->user, $create_user);
- $postarray['owner-name'] = $post->user->name;
- $postarray['owner-link'] = $post->user->statusnet_profile_url;
- $postarray['owner-avatar'] = $post->user->profile_image_url;
- }
- if (($contactid == 0) && !$only_existing_contact) {
- $contactid = $self['id'];
- } elseif ($contactid <= 0) {
- return [];
- }
-
- $postarray['contact-id'] = $contactid;
-
- $postarray['verb'] = Activity::POST;
-
- $postarray['author-name'] = $content->user->name;
- $postarray['author-link'] = $content->user->statusnet_profile_url;
- $postarray['author-avatar'] = $content->user->profile_image_url;
-
- // To-Do: Maybe unreliable? Can the api be entered without trailing "/"?
- $hostname = str_replace("/api/", "/notice/", DI::pConfig()->get($uid, 'statusnet', 'baseapi'));
-
- $postarray['plink'] = $hostname . $content->id;
- $postarray['app'] = strip_tags($content->source);
-
- if ($content->user->protected) {
- $postarray['private'] = 1;
- $postarray['allow_cid'] = '<' . $self['id'] . '>';
- }
-
- $postarray['body'] = HTML::toBBCode($content->statusnet_html);
-
- $postarray['body'] = statusnet_convertmsg($a, $postarray['body']);
-
- $postarray['created'] = DateTimeFormat::utc($content->created_at);
- $postarray['edited'] = DateTimeFormat::utc($content->created_at);
-
- if (!empty($content->place->name)) {
- $postarray["location"] = $content->place->name;
- }
-
- if (!empty($content->place->full_name)) {
- $postarray["location"] = $content->place->full_name;
- }
-
- if (!empty($content->geo->coordinates)) {
- $postarray["coord"] = $content->geo->coordinates[0] . " " . $content->geo->coordinates[1];
- }
-
- if (!empty($content->coordinates->coordinates)) {
- $postarray["coord"] = $content->coordinates->coordinates[1] . " " . $content->coordinates->coordinates[0];
- }
-
- Logger::log("statusnet_createpost: end", Logger::DEBUG);
-
- return $postarray;
-}
-
-function statusnet_fetchhometimeline(App $a, $uid, $mode = 1)
-{
- $conversations = [];
-
- $ckey = DI::pConfig()->get($uid, 'statusnet', 'consumerkey');
- $csecret = DI::pConfig()->get($uid, 'statusnet', 'consumersecret');
- $api = DI::pConfig()->get($uid, 'statusnet', 'baseapi');
- $otoken = DI::pConfig()->get($uid, 'statusnet', 'oauthtoken');
- $osecret = DI::pConfig()->get($uid, 'statusnet', 'oauthsecret');
- $create_user = DI::pConfig()->get($uid, 'statusnet', 'create_user');
-
- // "create_user" is deactivated, since currently you cannot add users manually by now
- $create_user = true;
-
- Logger::log("statusnet_fetchhometimeline: Fetching for user " . $uid, Logger::DEBUG);
-
- $connection = new StatusNetOAuth($api, $ckey, $csecret, $otoken, $osecret);
-
- $own_contact = statusnet_fetch_own_contact($a, $uid);
-
- if (empty($own_contact)) {
- return;
- }
-
- $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($own_contact),
- intval($uid));
-
- if (DBA::isResult($r)) {
- $nick = $r[0]["nick"];
- } else {
- Logger::log("statusnet_fetchhometimeline: Own GNU Social contact not found for user " . $uid, Logger::DEBUG);
- return;
- }
-
- $r = q("SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1",
- intval($uid));
-
- if (DBA::isResult($r)) {
- $self = $r[0];
- } else {
- Logger::log("statusnet_fetchhometimeline: Own contact not found for user " . $uid, Logger::DEBUG);
- return;
- }
-
- $u = q("SELECT * FROM user WHERE uid = %d LIMIT 1",
- intval($uid));
- if (!DBA::isResult($u)) {
- Logger::log("statusnet_fetchhometimeline: Own user not found for user " . $uid, Logger::DEBUG);
- return;
- }
-
- $parameters = ["exclude_replies" => false, "trim_user" => false, "contributor_details" => true, "include_rts" => true];
- //$parameters["count"] = 200;
-
- if ($mode == 1) {
- // Fetching timeline
- $lastid = DI::pConfig()->get($uid, 'statusnet', 'lasthometimelineid');
- //$lastid = 1;
-
- $first_time = ($lastid == "");
-
- if ($lastid != "") {
- $parameters["since_id"] = $lastid;
- }
-
- $items = $connection->get('statuses/home_timeline', $parameters);
-
- if (!is_array($items)) {
- if (is_object($items) && isset($items->error)) {
- $errormsg = $items->error;
- } elseif (is_object($items)) {
- $errormsg = print_r($items, true);
- } elseif (is_string($items) || is_float($items) || is_int($items)) {
- $errormsg = $items;
- } else {
- $errormsg = "Unknown error";
- }
-
- Logger::log("statusnet_fetchhometimeline: Error fetching home timeline: " . $errormsg, Logger::DEBUG);
- return;
- }
-
- $posts = array_reverse($items);
-
- Logger::log("statusnet_fetchhometimeline: Fetching timeline for user " . $uid . " " . sizeof($posts) . " items", Logger::DEBUG);
-
- if (count($posts)) {
- foreach ($posts as $post) {
-
- if ($post->id > $lastid) {
- $lastid = $post->id;
- }
-
- if ($first_time) {
- continue;
- }
-
- if (isset($post->statusnet_conversation_id)) {
- if (!isset($conversations[$post->statusnet_conversation_id])) {
- statusnet_complete_conversation($a, $uid, $self, $create_user, $nick, $post->statusnet_conversation_id);
- $conversations[$post->statusnet_conversation_id] = $post->statusnet_conversation_id;
- }
- } else {
- $postarray = statusnet_createpost($a, $uid, $post, $self, $create_user, true);
-
- if (trim($postarray['body']) == "") {
- continue;
- }
-
- $item = Item::insert($postarray);
- $postarray["id"] = $item;
-
- Logger::log('statusnet_fetchhometimeline: User ' . $self["nick"] . ' posted home timeline item ' . $item);
- }
- }
- }
- DI::pConfig()->set($uid, 'statusnet', 'lasthometimelineid', $lastid);
- }
-
- // Fetching mentions
- $lastid = DI::pConfig()->get($uid, 'statusnet', 'lastmentionid');
- $first_time = ($lastid == "");
-
- if ($lastid != "") {
- $parameters["since_id"] = $lastid;
- }
-
- $items = $connection->get('statuses/mentions_timeline', $parameters);
-
- if (!is_array($items)) {
- Logger::log("statusnet_fetchhometimeline: Error fetching mentions: " . print_r($items, true), Logger::DEBUG);
- return;
- }
-
- $posts = array_reverse($items);
-
- Logger::log("statusnet_fetchhometimeline: Fetching mentions for user " . $uid . " " . sizeof($posts) . " items", Logger::DEBUG);
-
- if (count($posts)) {
- foreach ($posts as $post) {
- if ($post->id > $lastid) {
- $lastid = $post->id;
- }
-
- if ($first_time) {
- continue;
- }
-
- $postarray = statusnet_createpost($a, $uid, $post, $self, false, false);
-
- if (isset($post->statusnet_conversation_id)) {
- if (!isset($conversations[$post->statusnet_conversation_id])) {
- statusnet_complete_conversation($a, $uid, $self, $create_user, $nick, $post->statusnet_conversation_id);
- $conversations[$post->statusnet_conversation_id] = $post->statusnet_conversation_id;
- }
- } else {
- if (trim($postarray['body']) == "") {
- continue;
- }
-
- $item = Item::insert($postarray);
-
- Logger::log('statusnet_fetchhometimeline: User ' . $self["nick"] . ' posted mention timeline item ' . $item);
- }
- }
- }
-
- DI::pConfig()->set($uid, 'statusnet', 'lastmentionid', $lastid);
-}
-
-function statusnet_complete_conversation(App $a, $uid, $self, $create_user, $nick, $conversation)
-{
- $ckey = DI::pConfig()->get($uid, 'statusnet', 'consumerkey');
- $csecret = DI::pConfig()->get($uid, 'statusnet', 'consumersecret');
- $api = DI::pConfig()->get($uid, 'statusnet', 'baseapi');
- $otoken = DI::pConfig()->get($uid, 'statusnet', 'oauthtoken');
- $osecret = DI::pConfig()->get($uid, 'statusnet', 'oauthsecret');
- $own_url = DI::pConfig()->get($uid, 'statusnet', 'own_url');
-
- $connection = new StatusNetOAuth($api, $ckey, $csecret, $otoken, $osecret);
-
- $parameters["count"] = 200;
-
- $items = $connection->get('statusnet/conversation/' . $conversation, $parameters);
- if (is_array($items)) {
- $posts = array_reverse($items);
-
- foreach ($posts as $post) {
- $postarray = statusnet_createpost($a, $uid, $post, $self, false, false);
-
- if (empty($postarray['body'])) {
- continue;
- }
-
- $item = Item::insert($postarray);
- $postarray["id"] = $item;
-
- Logger::log('statusnet_complete_conversation: User ' . $self["nick"] . ' posted home timeline item ' . $item);
- }
- }
-}
-
-function statusnet_convertmsg(App $a, $body)
-{
- $body = preg_replace("=\[url\=https?://([0-9]*).([0-9]*).([0-9]*).([0-9]*)/([0-9]*)\](.*?)\[\/url\]=ism", "$1.$2.$3.$4/$5", $body);
-
- $URLSearchString = "^\[\]";
- $links = preg_match_all("/[^!#@]\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", $body, $matches, PREG_SET_ORDER);
-
- $footer = "";
- $footerurl = "";
- $footerlink = "";
- $type = "";
-
- if ($links) {
- foreach ($matches AS $match) {
- $search = "[url=" . $match[1] . "]" . $match[2] . "[/url]";
-
- Logger::log("statusnet_convertmsg: expanding url " . $match[1], Logger::DEBUG);
-
- $expanded_url = DI::httpRequest()->finalUrl($match[1]);
-
- Logger::log("statusnet_convertmsg: fetching data for " . $expanded_url, Logger::DEBUG);
-
- $oembed_data = OEmbed::fetchURL($expanded_url, true);
-
- Logger::log("statusnet_convertmsg: fetching data: done", Logger::DEBUG);
-
- if ($type == "") {
- $type = $oembed_data->type;
- }
-
- if ($oembed_data->type == "video") {
- //$body = str_replace($search, "[video]".$expanded_url."[/video]", $body);
- $type = $oembed_data->type;
- $footerurl = $expanded_url;
- $footerlink = "[url=" . $expanded_url . "]" . $expanded_url . "[/url]";
-
- $body = str_replace($search, $footerlink, $body);
- } elseif (($oembed_data->type == "photo") && isset($oembed_data->url)) {
- $body = str_replace($search, "[url=" . $expanded_url . "][img]" . $oembed_data->url . "[/img][/url]", $body);
- } elseif ($oembed_data->type != "link") {
- $body = str_replace($search, "[url=" . $expanded_url . "]" . $expanded_url . "[/url]", $body);
- } else {
- $img_str = DI::httpRequest()->fetch($expanded_url, 4);
-
- $tempfile = tempnam(get_temppath(), "cache");
- file_put_contents($tempfile, $img_str);
- $mime = mime_content_type($tempfile);
- unlink($tempfile);
-
- if (substr($mime, 0, 6) == "image/") {
- $type = "photo";
- $body = str_replace($search, "[img]" . $expanded_url . "[/img]", $body);
- } else {
- $type = $oembed_data->type;
- $footerurl = $expanded_url;
- $footerlink = "[url=" . $expanded_url . "]" . $expanded_url . "[/url]";
-
- $body = str_replace($search, $footerlink, $body);
- }
- }
- }
-
- if ($footerurl != "") {
- $footer = "\n" . PageInfo::getFooterFromUrl($footerurl);
- }
-
- if (($footerlink != "") && (trim($footer) != "")) {
- $removedlink = trim(str_replace($footerlink, "", $body));
-
- if (($removedlink == "") || strstr($body, $removedlink)) {
- $body = $removedlink;
- }
-
- $body .= $footer;
- }
- }
-
- return $body;
-}
-
-function statusnet_fetch_own_contact(App $a, $uid)
-{
- $ckey = DI::pConfig()->get($uid, 'statusnet', 'consumerkey');
- $csecret = DI::pConfig()->get($uid, 'statusnet', 'consumersecret');
- $api = DI::pConfig()->get($uid, 'statusnet', 'baseapi');
- $otoken = DI::pConfig()->get($uid, 'statusnet', 'oauthtoken');
- $osecret = DI::pConfig()->get($uid, 'statusnet', 'oauthsecret');
- $own_url = DI::pConfig()->get($uid, 'statusnet', 'own_url');
-
- $contact_id = 0;
-
- if ($own_url == "") {
- $connection = new StatusNetOAuth($api, $ckey, $csecret, $otoken, $osecret);
-
- // Fetching user data
- $user = $connection->get('account/verify_credentials');
-
- if (empty($user)) {
- return false;
- }
-
- DI::pConfig()->set($uid, 'statusnet', 'own_url', Strings::normaliseLink($user->statusnet_profile_url));
-
- $contact_id = statusnet_fetch_contact($uid, $user, true);
- } else {
- $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `alias` = '%s' LIMIT 1",
- intval($uid), DBA::escape($own_url));
- if (DBA::isResult($r)) {
- $contact_id = $r[0]["id"];
- } else {
- DI::pConfig()->delete($uid, 'statusnet', 'own_url');
- }
- }
- return $contact_id;
-}
-
-function statusnet_is_retweet(App $a, $uid, $body)
-{
- $body = trim($body);
-
- // Skip if it isn't a pure repeated messages
- // Does it start with a share?
- if (strpos($body, "[share") > 0) {
- return false;
- }
-
- // Does it end with a share?
- if (strlen($body) > (strrpos($body, "[/share]") + 8)) {
- return false;
- }
-
- $attributes = preg_replace("/\[share(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism", "$1", $body);
- // Skip if there is no shared message in there
- if ($body == $attributes) {
- return false;
- }
-
- $link = "";
- preg_match("/link='(.*?)'/ism", $attributes, $matches);
- if (!empty($matches[1])) {
- $link = $matches[1];
- }
-
- preg_match('/link="(.*?)"/ism', $attributes, $matches);
- if (!empty($matches[1])) {
- $link = $matches[1];
- }
-
- $ckey = DI::pConfig()->get($uid, 'statusnet', 'consumerkey');
- $csecret = DI::pConfig()->get($uid, 'statusnet', 'consumersecret');
- $api = DI::pConfig()->get($uid, 'statusnet', 'baseapi');
- $otoken = DI::pConfig()->get($uid, 'statusnet', 'oauthtoken');
- $osecret = DI::pConfig()->get($uid, 'statusnet', 'oauthsecret');
- $hostname = preg_replace("=https?://([\w\.]*)/.*=ism", "$1", $api);
-
- $id = preg_replace("=https?://" . $hostname . "/notice/(.*)=ism", "$1", $link);
-
- if ($id == $link) {
- return false;
- }
-
- Logger::log('statusnet_is_retweet: Retweeting id ' . $id . ' for user ' . $uid, Logger::DEBUG);
-
- $connection = new StatusNetOAuth($api, $ckey, $csecret, $otoken, $osecret);
-
- $result = $connection->post('statuses/retweet/' . $id);
-
- Logger::log('statusnet_is_retweet: result ' . print_r($result, true), Logger::DEBUG);
-
- return isset($result->id);
-}