From c02acd7341cc3104b75a56e0b8dfd4811e77e278 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Thu, 2 Jul 2009 16:16:17 -0700 Subject: [PATCH 1/6] Better comment about syslog log facility --- config.php.sample | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.php.sample b/config.php.sample index 4f8f715beb..57aa6a6c8c 100644 --- a/config.php.sample +++ b/config.php.sample @@ -36,7 +36,7 @@ $config['site']['path'] = 'laconica'; // If you want logging sent to a file instead of syslog // $config['site']['logfile'] = '/tmp/laconica.log'; -// Change the syslog facility that Laconica logs to +// Change the syslog facility that Laconica logs to (default is LOG_USER) // $config['syslog']['facility'] = LOG_LOCAL7; // Enables extra log information, for example full details of PEAR DB errors From acb4c783463660710e894ecb54ebaebb3d1ae77c Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Thu, 2 Jul 2009 17:32:27 -0700 Subject: [PATCH 2/6] Route and stub for new friendships/show API method --- actions/twitapifriendships.php | 14 ++++++++++++++ lib/router.php | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/actions/twitapifriendships.php b/actions/twitapifriendships.php index 29eb4cc0ff..35e0164318 100644 --- a/actions/twitapifriendships.php +++ b/actions/twitapifriendships.php @@ -160,4 +160,18 @@ class TwitapifriendshipsAction extends TwitterapiAction } + function show($args, $apidata) + { + + parent::handle($args); + + if (!in_array($apidata['content-type'], array('xml', 'json'))) { + $this->clientError(_('API method not found!'), $code = 404); + return; + } + + print "gar"; + + } + } \ No newline at end of file diff --git a/lib/router.php b/lib/router.php index 784ea98823..50b733453e 100644 --- a/lib/router.php +++ b/lib/router.php @@ -317,7 +317,7 @@ class Router $m->connect('api/friendships/:method', array('action' => 'api', 'apiaction' => 'friendships'), - array('method' => 'exists(\.(xml|json))')); + array('method' => '(show|exists)(\.(xml|json))')); // Social graph From a2a4cc35f6db17e381d3f42b227d86fac12e81a8 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Fri, 3 Jul 2009 15:42:12 -0700 Subject: [PATCH 3/6] Implement friendships/show API method --- actions/twitapifriendships.php | 73 ++++++++++++++++++++++++++++++++-- lib/twitterapi.php | 61 ++++++++++++++++++++++++++++ 2 files changed, 131 insertions(+), 3 deletions(-) diff --git a/actions/twitapifriendships.php b/actions/twitapifriendships.php index 35e0164318..5fb55e9ffe 100644 --- a/actions/twitapifriendships.php +++ b/actions/twitapifriendships.php @@ -162,7 +162,6 @@ class TwitapifriendshipsAction extends TwitterapiAction function show($args, $apidata) { - parent::handle($args); if (!in_array($apidata['content-type'], array('xml', 'json'))) { @@ -170,8 +169,76 @@ class TwitapifriendshipsAction extends TwitterapiAction return; } - print "gar"; + $source_id = (int)$this->trimmed('source_id'); + $source_screen_name = $this->trimmed('source_screen_name'); + // If the source is not specified for an unauthenticated request, + // the method will return an HTTP 403. + + if (empty($source_id) && empty($source_screen_name)) { + if (empty($apidata['user'])) { + $this->clientError(_('Could not determine source user.'), + $code = 403); + return; + } + } + + $source = null; + + if (!empty($source_id)) { + $source = User::staticGet($source_id); + } elseif (!empty($source_screen_name)) { + $source = User::staticGet('nickname', $source_screen_name); + } else { + $source = $apidata['user']; + } + + // If a source or target is specified but does not exist, + // the method will return an HTTP 404. + + if (empty($source)) { + $this->clientError(_('Could not determine source user.'), + $code = 404); + return; + } + + $target_id = (int)$this->trimmed('target_id'); + $target_screen_name = $this->trimmed('target_screen_name'); + + $target = null; + + if (!empty($target_id)) { + $target = User::staticGet($target_id); + } elseif (!empty($target_screen_name)) { + $target = User::staticGet('nickname', $target_screen_name); + } else { + $this->clientError(_('Target user not specified.'), + $code = 403); + return; + } + + if (empty($target)) { + $this->clientError(_('Could not find target user.'), + $code = 404); + return; + } + + $result = $this->twitter_relationship_array($source, $target); + + switch ($apidata['content-type']) { + case 'xml': + $this->init_document('xml'); + $this->show_twitter_xml_relationship($result[relationship]); + $this->end_document('xml'); + break; + case 'json': + $this->init_document('json'); + print json_encode($result); + $this->end_document('json'); + break; + default: + break; + } } -} \ No newline at end of file +} diff --git a/lib/twitterapi.php b/lib/twitterapi.php index f538a02981..40e5b50677 100644 --- a/lib/twitterapi.php +++ b/lib/twitterapi.php @@ -278,6 +278,67 @@ class TwitterapiAction extends Action return $twitter_dm; } + function twitter_relationship_array($source, $target) + { + $relationship = array(); + + $relationship['source'] = + $this->relationship_details_array($source, $target); + $relationship['target'] = + $this->relationship_details_array($target, $source); + + return array('relationship' => $relationship); + } + + function relationship_details_array($source, $target) + { + $details = array(); + + $details['screen_name'] = $source->nickname; + $details['followed_by'] = $target->isSubscribed($source); + $details['following'] = $source->isSubscribed($target); + + $notifications = false; + + if ($source->isSubscribed($target)) { + + $sub = Subscription::pkeyGet(array('subscriber' => + $source->id, 'subscribed' => $target->id)); + + if (!empty($sub)) { + $notifications = ($sub->jabber || $sub->sms); + } + } + + $details['notifications_enabled'] = $notifications; + $details['blocking'] = $source->hasBlocked($target); + $details['id'] = $source->id; + + return $details; + } + + function show_twitter_xml_relationship($relationship) + { + $this->elementStart('relationship'); + + foreach($relationship as $element => $value) { + if ($element == 'source' || $element == 'target') { + $this->elementStart($element); + $this->show_xml_relationship_details($value); + $this->elementEnd($element); + } + } + + $this->elementEnd('relationship'); + } + + function show_xml_relationship_details($details) + { + foreach($details as $element => $value) { + $this->element($element, null, $value); + } + } + function show_twitter_xml_status($twitter_status) { $this->elementStart('status'); From 53b7fb7f1c4092654c968a3de64d7d0a90d4d403 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Sat, 4 Jul 2009 18:28:24 +0000 Subject: [PATCH 4/6] Using box-shadow on the site_nav_local_views li instead of a. --- theme/default/css/display.css | 6 ++++-- theme/identica/css/display.css | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/theme/default/css/display.css b/theme/default/css/display.css index 89197bddb9..251d6706be 100644 --- a/theme/default/css/display.css +++ b/theme/default/css/display.css @@ -115,12 +115,14 @@ border-color:transparent; background-color:#FFFFFF; } -#site_nav_local_views a { -background-color:rgba(194, 194, 194, 0.5); +#site_nav_local_views li { box-shadow:3px 7px 5px rgba(194, 194, 194, 0.5); -moz-box-shadow:3px 7px 5px rgba(194, 194, 194, 0.5); -webkit-box-shadow:3px 7px 5px rgba(194, 194, 194, 0.5); } +#site_nav_local_views a { +background-color:rgba(194, 194, 194, 0.5); +} #site_nav_local_views a:hover { background-color:rgba(255, 255, 255, 0.7); } diff --git a/theme/identica/css/display.css b/theme/identica/css/display.css index 025debf34c..42a4573a74 100644 --- a/theme/identica/css/display.css +++ b/theme/identica/css/display.css @@ -115,12 +115,14 @@ border-color:transparent; background-color:#FFFFFF; } -#site_nav_local_views a { -background-color:rgba(194, 194, 194, 0.5); +#site_nav_local_views li { box-shadow:3px 7px 5px rgba(194, 194, 194, 0.5); -moz-box-shadow:3px 7px 5px rgba(194, 194, 194, 0.5); -webkit-box-shadow:3px 7px 5px rgba(194, 194, 194, 0.5); } +#site_nav_local_views a { +background-color:rgba(194, 194, 194, 0.5); +} #site_nav_local_views a:hover { background-color:rgba(255, 255, 255, 0.7); } From ac361791c419126e297e018db9a5fd8b6144c6e2 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 5 Jul 2009 11:32:57 -0400 Subject: [PATCH 5/6] fix caching of faves by own, other --- classes/Fave.php | 2 +- classes/User.php | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/classes/Fave.php b/classes/Fave.php index f4cf6256ff..c3ec62dcf0 100644 --- a/classes/Fave.php +++ b/classes/Fave.php @@ -42,7 +42,7 @@ class Fave extends Memcached_DataObject $ids = Notice::stream(array('Fave', '_streamDirect'), array($user_id, $own), ($own) ? 'fave:ids_by_user_own:'.$user_id : - 'fave:by_user:'.$user_id, + 'fave:ids_by_user:'.$user_id, $offset, $limit); return $ids; } diff --git a/classes/User.php b/classes/User.php index 62a3f8a66e..04b38a0d22 100644 --- a/classes/User.php +++ b/classes/User.php @@ -491,6 +491,8 @@ class User extends Memcached_DataObject // ;last cache, too $cache->delete(common_cache_key('fave:ids_by_user:'.$this->id)); $cache->delete(common_cache_key('fave:ids_by_user:'.$this->id.';last')); + $cache->delete(common_cache_key('fave:ids_by_user_own:'.$this->id)); + $cache->delete(common_cache_key('fave:ids_by_user_own:'.$this->id.';last')); } } From 83adf9fa1ab9d288e86fba9907be11454c3e0e28 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 5 Jul 2009 11:47:14 -0400 Subject: [PATCH 6/6] don't hide unsub button for remote users --- lib/profilelist.php | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/profilelist.php b/lib/profilelist.php index e13d56a9a6..774538a4b6 100644 --- a/lib/profilelist.php +++ b/lib/profilelist.php @@ -243,20 +243,20 @@ class ProfileListItem extends Widget $user = common_current_user(); if (!empty($user) && $this->profile->id != $user->id) { - // Is it a local user? can't remote sub from a list - // XXX: make that possible! - $other = User::staticGet('id', $this->profile->id); - if (!empty($other)) { - $this->out->elementStart('li', 'entity_subscribe'); - if ($user->isSubscribed($this->profile)) { - $usf = new UnsubscribeForm($this->out, $this->profile); - $usf->show(); - } else { + $this->out->elementStart('li', 'entity_subscribe'); + if ($user->isSubscribed($this->profile)) { + $usf = new UnsubscribeForm($this->out, $this->profile); + $usf->show(); + } else { + // Is it a local user? can't remote sub from a list + // XXX: make that possible! + $other = User::staticGet('id', $this->profile->id); + if (!empty($other)) { $sf = new SubscribeForm($this->out, $this->profile); $sf->show(); } - $this->out->elementEnd('li'); } + $this->out->elementEnd('li'); } }