Merge branch 'master' of https://github.com/hannesmannerheim/qvitter into mention_fixing

This commit is contained in:
Mikael Nordfeldth 2015-06-02 14:04:35 +02:00
commit 2cabb47269
4 changed files with 92 additions and 61 deletions

View File

@ -47,64 +47,98 @@ class ApiExternalUserShowAction extends ApiPrivateAuthAction
parent::prepare($args); parent::prepare($args);
$profileurl = urldecode($this->arg('profileurl')); $profileurl = urldecode($this->arg('profileurl'));
$nickname = urldecode($this->arg('nickname'));
// if this is an instance/user/1234 type url, try to find real profile url
if(strstr($profileurl, '/user/')) {
$redrected_profileurl = $this->getRedirectUrl($profileurl);
if (!empty($redrected_profileurl)) {
$profileurl = $redrected_profileurl;
}
}
// get local profile
$local_profile = Profile::getKV('profileurl',$profileurl);
$this->profile = new stdClass(); $this->profile = new stdClass();
$this->profile->external = null;
$this->profile->local = null;
// we can get urls of two types of urls (1) ://instance/nickname
// (2) ://instance/user/1234
//
// in case (1) we have the problem that the html can be outdated,
// i.e. the user can have changed her nickname. we also have no idea
// if it is a multi or single user instance, which forces us to
// guess the api root url.
//
// in case (2) we have another problem: we can't use that url to find
// the local profile for the external user, we need url:s of type (2)
// for that. so we have to try getting the nickname from the external
// instance first
// case (2)
if(strstr($profileurl, '/user/')) {
$external_user_id = substr($profileurl,strpos($profileurl,'/user/')+6);
$external_instance_url = substr($profileurl,0,strpos($profileurl,'/user/')+1);
if(!is_numeric($external_user_id)) {
return true;
}
$external_profile = $this->getProfileFromExternalInstance($external_instance_url,$external_user_id);
if(!isset($external_profile->statusnet_profile_url)) {
return true;
}
$this->profile->external = $external_profile;
$local_profile = Profile::getKV('profileurl',$external_profile->statusnet_profile_url);
if(!$local_profile instanceof Profile) {
return true;
}
if($local_profile) {
$this->profile->local = $this->twitterUserArray($local_profile); $this->profile->local = $this->twitterUserArray($local_profile);
return true;
}
$username = $this->profile->local['screen_name']; // case (1)
$local_profile = Profile::getKV('profileurl',$profileurl);
if($local_profile instanceof Profile) {
// if profile url is not ending with nickname, this is probably a single user instance // if profile url is not ending with nickname, this is probably a single user instance
if(!substr($profileurl, -strlen($username))===$username) { if(!substr($local_profile->profileurl, -strlen($local_profile->nickname))===$local_profile->nickname) {
$instanceurl = $profileurl; $external_instance_url = $local_profile->profileurl;
} }
// multi user instance // multi user instance
else { else {
$instanceurl = substr($profileurl, 0, strrpos($profileurl, '/')); $external_instance_url = substr($local_profile->profileurl, 0, strrpos($local_profile->profileurl, '/'));
} }
$external_profile = $this->getProfileFromExternalInstance($external_instance_url,$local_profile->nickname);
if(!isset($external_profile->statusnet_profile_url)) {
return true;
} }
// we don't know this user $this->profile->external = $external_profile;
else { $this->profile->local = $this->twitterUserArray($local_profile);
return true;
}
// if we don't know about this user, or the user has changed nickname
// if profile url ends with '/' this is probably an unknown single user instance // if profile url ends with '/' this is probably an unknown single user instance
if(substr($profileurl, -1)==='/') { if(substr($profileurl, -1)==='/') {
$instanceurl = $profileurl; $instanceurl = $profileurl;
$username = 1; $user_id_or_nickname = 1;
} }
// multi user instance // multi user instance
else { else {
$username = substr($profileurl, strrpos($profileurl, '/')+1); $user_id_or_nickname = substr($profileurl, strrpos($profileurl, '/')+1);
$instanceurl = substr($profileurl, 0, strrpos($profileurl, '/')); $instanceurl = substr($profileurl, 0, strrpos($profileurl, '/'));
} }
$external_profile = $this->getProfileFromExternalInstance($instanceurl,$user_id_or_nickname);
if(!isset($external_profile->statusnet_profile_url)) {
return true;
} }
$this->profile->external = $external_profile;
// get profile from external instance
$apicall = $instanceurl.'/api/users/show.json?id='.$username;
$client = new HTTPClient();
$response = $client->get($apicall);
// json_decode returns null if it fails to decode
$this->profile->external = $response->isOk() ? json_decode($response->getBody()) : null;
return true; return true;
} }
/** /**
@ -141,20 +175,17 @@ class ApiExternalUserShowAction extends ApiPrivateAuthAction
/** /**
* Get redirect(s) for an url * Get profile from external instance
* *
* @return null or profile object
*/ */
function getRedirectUrl ($url) { function getProfileFromExternalInstance($instance_url,$user_id_or_nickname)
stream_context_set_default(array( {
'http' => array( $apicall = $instance_url.'/api/users/show.json?id='.$user_id_or_nickname;
'method' => 'HEAD' $client = new HTTPClient();
) $response = $client->get($apicall);
)); // json_decode returns null if it fails to decode
$headers = get_headers($url, 1); return $response->isOk() ? json_decode($response->getBody()) : null;
if ($headers !== false && isset($headers['Location'])) {
return $headers['Location'];
}
return false;
} }

View File

@ -518,10 +518,10 @@ class QvitterAction extends ApiAction
<script type="text/javascript" src="<?php print $qvitterpath; ?>js/lib/jquery.jWindowCrop.js?changed=<?php print date('YmdHis',filemtime(QVITTERDIR.'/js/lib/jquery.jWindowCrop.js')); ?>"></script> <script type="text/javascript" src="<?php print $qvitterpath; ?>js/lib/jquery.jWindowCrop.js?changed=<?php print date('YmdHis',filemtime(QVITTERDIR.'/js/lib/jquery.jWindowCrop.js')); ?>"></script>
<script type="text/javascript" src="<?php print $qvitterpath; ?>js/lib/load-image.min.js?changed=<?php print date('YmdHis',filemtime(QVITTERDIR.'/js/lib/load-image.min.js')); ?>"></script> <script type="text/javascript" src="<?php print $qvitterpath; ?>js/lib/load-image.min.js?changed=<?php print date('YmdHis',filemtime(QVITTERDIR.'/js/lib/load-image.min.js')); ?>"></script>
<script type="text/javascript" src="<?php print $qvitterpath; ?>js/lib/xregexp-all-min-2.0.0.js?changed=<?php print date('YmdHis',filemtime(QVITTERDIR.'/js/lib/xregexp-all-min-2.0.0.js')); ?>"></script> <script type="text/javascript" src="<?php print $qvitterpath; ?>js/lib/xregexp-all-min-2.0.0.js?changed=<?php print date('YmdHis',filemtime(QVITTERDIR.'/js/lib/xregexp-all-min-2.0.0.js')); ?>"></script>
<script type="text/javascript" src="<?php print $qvitterpath; ?>js/dom-functions.js?changed=<?php print date('YmdHis',filemtime(QVITTERDIR.'/js/dom-functions.js')); ?>"></script> <script charset="utf-8" type="text/javascript" src="<?php print $qvitterpath; ?>js/dom-functions.js?changed=<?php print date('YmdHis',filemtime(QVITTERDIR.'/js/dom-functions.js')); ?>"></script>
<script type="text/javascript" src="<?php print $qvitterpath; ?>js/misc-functions.js?changed=<?php print date('YmdHis',filemtime(QVITTERDIR.'/js/misc-functions.js')); ?>"></script> <script charset="utf-8" type="text/javascript" src="<?php print $qvitterpath; ?>js/misc-functions.js?changed=<?php print date('YmdHis',filemtime(QVITTERDIR.'/js/misc-functions.js')); ?>"></script>
<script type="text/javascript" src="<?php print $qvitterpath; ?>js/ajax-functions.js?changed=<?php print date('YmdHis',filemtime(QVITTERDIR.'/js/ajax-functions.js')); ?>"></script> <script charset="utf-8" type="text/javascript" src="<?php print $qvitterpath; ?>js/ajax-functions.js?changed=<?php print date('YmdHis',filemtime(QVITTERDIR.'/js/ajax-functions.js')); ?>"></script>
<script type="text/javascript" src="<?php print $qvitterpath; ?>js/qvitter.js?changed=<?php print date('YmdHis',filemtime(QVITTERDIR.'/js/qvitter.js')); ?>"></script> <script charset="utf-8" type="text/javascript" src="<?php print $qvitterpath; ?>js/qvitter.js?changed=<?php print date('YmdHis',filemtime(QVITTERDIR.'/js/qvitter.js')); ?>"></script>
<?php <?php
// event for other plugins to add scripts to qvitter // event for other plugins to add scripts to qvitter

View File

@ -1041,7 +1041,7 @@ $('body').on('click','a', function(e) {
// local profile id and follow class // local profile id and follow class
var followLocalIdHtml = ''; var followLocalIdHtml = '';
var followingClass = ''; var followingClass = '';
if(typeof data.local != 'undefined') { if(typeof data.local != 'undefined' && data.local !== null) {
followLocalIdHtml = ' data-follow-user-id="' + data.local.id + '"'; followLocalIdHtml = ' data-follow-user-id="' + data.local.id + '"';
if(data.local.following) { if(data.local.following) {