forked from GNUsocial/gnu-social
		
	Merge branch '0.7.x' into 0.8.x
This commit is contained in:
		@@ -392,6 +392,8 @@ class TwittersettingsAction extends ConnectSettingsAction
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        if ($friendsync) {
 | 
					        if ($friendsync) {
 | 
				
			||||||
            save_twitter_friends($user, $twit_user->id, $screen_name, $password);
 | 
					            save_twitter_friends($user, $twit_user->id, $screen_name, $password);
 | 
				
			||||||
 | 
					            $flink->last_friendsync = common_sql_now();
 | 
				
			||||||
 | 
					            $flink->update();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $this->showForm(_('Twitter settings saved.'), true);
 | 
					        $this->showForm(_('Twitter settings saved.'), true);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,4 +36,53 @@ class Fave extends Memcached_DataObject
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        return Memcached_DataObject::pkeyGet('Fave', $kv);
 | 
					        return Memcached_DataObject::pkeyGet('Fave', $kv);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function stream($user_id, $offset=0, $limit=NOTICES_PER_PAGE)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $ids = Notice::stream(array('Fave', '_streamDirect'),
 | 
				
			||||||
 | 
					                              array($user_id),
 | 
				
			||||||
 | 
					                              'fave:ids_by_user:'.$user_id,
 | 
				
			||||||
 | 
					                              $offset, $limit);
 | 
				
			||||||
 | 
					        return $ids;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function _streamDirect($user_id, $offset, $limit, $since_id, $before_id, $since)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $fav = new Fave();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $fav->user_id = $user_id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $fav->selectAdd();
 | 
				
			||||||
 | 
					        $fav->selectAdd('notice_id');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($since_id != 0) {
 | 
				
			||||||
 | 
					            $fav->whereAdd('notice_id > ' . $since_id);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($before_id != 0) {
 | 
				
			||||||
 | 
					            $fav->whereAdd('notice_id < ' . $before_id);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!is_null($since)) {
 | 
				
			||||||
 | 
					            $fav->whereAdd('modified > \'' . date('Y-m-d H:i:s', $since) . '\'');
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // NOTE: we sort by fave time, not by notice time!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $fav->orderBy('modified DESC');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!is_null($offset)) {
 | 
				
			||||||
 | 
					            $fav->limit($offset, $limit);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $ids = array();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($fav->find()) {
 | 
				
			||||||
 | 
					            while ($fav->fetch()) {
 | 
				
			||||||
 | 
					                $ids[] = $fav->notice_id;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $ids;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -308,9 +308,9 @@ class Notice extends Memcached_DataObject
 | 
				
			|||||||
            $group_inbox->notice_id = $this->id;
 | 
					            $group_inbox->notice_id = $this->id;
 | 
				
			||||||
            if ($group_inbox->find()) {
 | 
					            if ($group_inbox->find()) {
 | 
				
			||||||
                while ($group_inbox->fetch()) {
 | 
					                while ($group_inbox->fetch()) {
 | 
				
			||||||
                    $cache->delete(common_cache_key('group:notices:'.$group_inbox->group_id));
 | 
					                    $cache->delete(common_cache_key('user_group:notice_ids:' . $group_inbox->group_id));
 | 
				
			||||||
                    if ($blowLast) {
 | 
					                    if ($blowLast) {
 | 
				
			||||||
                        $cache->delete(common_cache_key('group:notices:'.$group_inbox->group_id.';last'));
 | 
					                        $cache->delete(common_cache_key('user_group:notice_ids:' . $group_inbox->group_id.';last'));
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    $member = new Group_member();
 | 
					                    $member = new Group_member();
 | 
				
			||||||
                    $member->group_id = $group_inbox->group_id;
 | 
					                    $member->group_id = $group_inbox->group_id;
 | 
				
			||||||
@@ -337,10 +337,7 @@ class Notice extends Memcached_DataObject
 | 
				
			|||||||
            $tag->notice_id = $this->id;
 | 
					            $tag->notice_id = $this->id;
 | 
				
			||||||
            if ($tag->find()) {
 | 
					            if ($tag->find()) {
 | 
				
			||||||
                while ($tag->fetch()) {
 | 
					                while ($tag->fetch()) {
 | 
				
			||||||
                    $cache->delete(common_cache_key('notice_tag:notice_stream:' . $tag->tag));
 | 
					                    $tag->blowCache($blowLast);
 | 
				
			||||||
                    if ($blowLast) {
 | 
					 | 
				
			||||||
                        $cache->delete(common_cache_key('notice_tag:notice_stream:' . $tag->tag . ';last'));
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            $tag->free();
 | 
					            $tag->free();
 | 
				
			||||||
@@ -375,10 +372,10 @@ class Notice extends Memcached_DataObject
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        if ($this->is_local) {
 | 
					        if ($this->is_local) {
 | 
				
			||||||
            $cache = common_memcache();
 | 
					            $cache = common_memcache();
 | 
				
			||||||
            if ($cache) {
 | 
					            if (!empty($cache)) {
 | 
				
			||||||
                $cache->delete(common_cache_key('profile:notices:'.$this->profile_id));
 | 
					                $cache->delete(common_cache_key('profile:notice_ids:'.$this->profile_id));
 | 
				
			||||||
                if ($blowLast) {
 | 
					                if ($blowLast) {
 | 
				
			||||||
                    $cache->delete(common_cache_key('profile:notices:'.$this->profile_id.';last'));
 | 
					                    $cache->delete(common_cache_key('profile:notice_ids:'.$this->profile_id.';last'));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -392,9 +389,9 @@ class Notice extends Memcached_DataObject
 | 
				
			|||||||
            $reply->notice_id = $this->id;
 | 
					            $reply->notice_id = $this->id;
 | 
				
			||||||
            if ($reply->find()) {
 | 
					            if ($reply->find()) {
 | 
				
			||||||
                while ($reply->fetch()) {
 | 
					                while ($reply->fetch()) {
 | 
				
			||||||
                    $cache->delete(common_cache_key('user:replies:'.$reply->profile_id));
 | 
					                    $cache->delete(common_cache_key('reply:stream:'.$reply->profile_id));
 | 
				
			||||||
                    if ($blowLast) {
 | 
					                    if ($blowLast) {
 | 
				
			||||||
                        $cache->delete(common_cache_key('user:replies:'.$reply->profile_id.';last'));
 | 
					                        $cache->delete(common_cache_key('reply:stream:'.$reply->profile_id.';last'));
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -424,9 +421,9 @@ class Notice extends Memcached_DataObject
 | 
				
			|||||||
            $fave->notice_id = $this->id;
 | 
					            $fave->notice_id = $this->id;
 | 
				
			||||||
            if ($fave->find()) {
 | 
					            if ($fave->find()) {
 | 
				
			||||||
                while ($fave->fetch()) {
 | 
					                while ($fave->fetch()) {
 | 
				
			||||||
                    $cache->delete(common_cache_key('user:faves:'.$fave->user_id));
 | 
					                    $cache->delete(common_cache_key('fave:ids_by_user:'.$fave->user_id));
 | 
				
			||||||
                    if ($blowLast) {
 | 
					                    if ($blowLast) {
 | 
				
			||||||
                        $cache->delete(common_cache_key('user:faves:'.$fave->user_id.';last'));
 | 
					                        $cache->delete(common_cache_key('fave:ids_by_user:'.$fave->user_id.';last'));
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37,21 +37,62 @@ class Notice_tag extends Memcached_DataObject
 | 
				
			|||||||
    ###END_AUTOCODE
 | 
					    ###END_AUTOCODE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static function getStream($tag, $offset=0, $limit=20) {
 | 
					    static function getStream($tag, $offset=0, $limit=20) {
 | 
				
			||||||
        $qry =
 | 
					 | 
				
			||||||
          'SELECT notice.* ' .
 | 
					 | 
				
			||||||
          'FROM notice JOIN notice_tag ON notice.id = notice_tag.notice_id ' .
 | 
					 | 
				
			||||||
          "WHERE notice_tag.tag = '%s' ";
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return Notice::getStream(sprintf($qry, $tag),
 | 
					        $ids = Notice::stream(array('Notice_tag', '_streamDirect'),
 | 
				
			||||||
                                 'notice_tag:notice_stream:' . common_keyize($tag),
 | 
					                              array($tag),
 | 
				
			||||||
 | 
					                              'notice_tag:notice_ids:' . common_keyize($tag),
 | 
				
			||||||
                              $offset, $limit);
 | 
					                              $offset, $limit);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return Notice::getStreamByIds($ids);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function blowCache()
 | 
					    function _streamDirect($tag, $offset, $limit, $since_id, $before_id, $since)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $nt = new Notice_tag();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $nt->tag = $tag;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $nt->selectAdd();
 | 
				
			||||||
 | 
					        $nt->selectAdd('notice_id');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($since_id != 0) {
 | 
				
			||||||
 | 
					            $nt->whereAdd('notice_id > ' . $since_id);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($before_id != 0) {
 | 
				
			||||||
 | 
					            $nt->whereAdd('notice_id < ' . $before_id);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!is_null($since)) {
 | 
				
			||||||
 | 
					            $nt->whereAdd('created > \'' . date('Y-m-d H:i:s', $since) . '\'');
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $nt->orderBy('notice_id DESC');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!is_null($offset)) {
 | 
				
			||||||
 | 
					            $nt->limit($offset, $limit);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $ids = array();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($nt->find()) {
 | 
				
			||||||
 | 
					            while ($nt->fetch()) {
 | 
				
			||||||
 | 
					                $ids[] = $nt->notice_id;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $ids;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function blowCache($blowLast=false)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $cache = common_memcache();
 | 
					        $cache = common_memcache();
 | 
				
			||||||
        if ($cache) {
 | 
					        if ($cache) {
 | 
				
			||||||
            $cache->delete(common_cache_key('notice_tag:notice_stream:' . $this->tag));
 | 
					            $idkey = common_cache_key('notice_tag:notice_ids:' . common_keyize($this->tag));
 | 
				
			||||||
 | 
					            $cache->delete($idkey);
 | 
				
			||||||
 | 
					            if ($blowLast) {
 | 
				
			||||||
 | 
					                $cache->delete($idkey.';last');
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -155,14 +155,51 @@ class Profile extends Memcached_DataObject
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0)
 | 
					    function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $qry =
 | 
					        // XXX: I'm not sure this is going to be any faster. It probably isn't.
 | 
				
			||||||
          'SELECT * ' .
 | 
					        $ids = Notice::stream(array($this, '_streamDirect'),
 | 
				
			||||||
          'FROM notice ' .
 | 
					                              array(),
 | 
				
			||||||
          'WHERE profile_id = %d ';
 | 
					                              'profile:notice_ids:' . $this->id,
 | 
				
			||||||
 | 
					 | 
				
			||||||
        return Notice::getStream(sprintf($qry, $this->id),
 | 
					 | 
				
			||||||
                                 'profile:notices:'.$this->id,
 | 
					 | 
				
			||||||
                              $offset, $limit, $since_id, $before_id);
 | 
					                              $offset, $limit, $since_id, $before_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return Notice::getStreamByIds($ids);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function _streamDirect($offset, $limit, $since_id, $before_id, $since)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $notice = new Notice();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $notice->profile_id = $this->id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $notice->selectAdd();
 | 
				
			||||||
 | 
					        $notice->selectAdd('id');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($since_id != 0) {
 | 
				
			||||||
 | 
					            $notice->whereAdd('id > ' . $since_id);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($before_id != 0) {
 | 
				
			||||||
 | 
					            $notice->whereAdd('id < ' . $before_id);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!is_null($since)) {
 | 
				
			||||||
 | 
					            $notice->whereAdd('created > \'' . date('Y-m-d H:i:s', $since) . '\'');
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $notice->orderBy('id DESC');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!is_null($offset)) {
 | 
				
			||||||
 | 
					            $notice->limit($offset, $limit);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $ids = array();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($notice->find()) {
 | 
				
			||||||
 | 
					            while ($notice->fetch()) {
 | 
				
			||||||
 | 
					                $ids[] = $notice->id;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $ids;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function isMember($group)
 | 
					    function isMember($group)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,4 +21,47 @@ class Reply extends Memcached_DataObject
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    /* the code above is auto generated do not remove the tag below */
 | 
					    /* the code above is auto generated do not remove the tag below */
 | 
				
			||||||
    ###END_AUTOCODE
 | 
					    ###END_AUTOCODE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function stream($user_id, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=null)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $ids = Notice::stream(array('Reply', '_streamDirect'),
 | 
				
			||||||
 | 
					                              array($user_id),
 | 
				
			||||||
 | 
					                              'reply:stream:' . $user_id,
 | 
				
			||||||
 | 
					                              $offset, $limit, $since_id, $before_id, $since);
 | 
				
			||||||
 | 
					        return $ids;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function _streamDirect($user_id, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=null)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $reply = new Reply();
 | 
				
			||||||
 | 
					        $reply->profile_id = $user_id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($since_id != 0) {
 | 
				
			||||||
 | 
					            $reply->whereAdd('notice_id > ' . $since_id);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($before_id != 0) {
 | 
				
			||||||
 | 
					            $reply->whereAdd('notice_id < ' . $before_id);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!is_null($since)) {
 | 
				
			||||||
 | 
					            $reply->whereAdd('modified > \'' . date('Y-m-d H:i:s', $since) . '\'');
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $reply->orderBy('notice_id DESC');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!is_null($offset)) {
 | 
				
			||||||
 | 
					            $reply->limit($offset, $limit);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $ids = array();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($reply->find()) {
 | 
				
			||||||
 | 
					            while ($reply->fetch()) {
 | 
				
			||||||
 | 
					                $ids[] = $reply->notice_id;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $ids;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -349,30 +349,31 @@ class User extends Memcached_DataObject
 | 
				
			|||||||
        $cache = common_memcache();
 | 
					        $cache = common_memcache();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // XXX: Kind of a hack.
 | 
					        // XXX: Kind of a hack.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if ($cache) {
 | 
					        if ($cache) {
 | 
				
			||||||
            // This is the stream of favorite notices, in rev chron
 | 
					            // This is the stream of favorite notices, in rev chron
 | 
				
			||||||
            // order. This forces it into cache.
 | 
					            // order. This forces it into cache.
 | 
				
			||||||
            $faves = $this->favoriteNotices(0, NOTICE_CACHE_WINDOW);
 | 
					
 | 
				
			||||||
            $cnt = 0;
 | 
					            $ids = Fave::stream($this->id, 0, NOTICE_CACHE_WINDOW);
 | 
				
			||||||
            while ($faves->fetch()) {
 | 
					
 | 
				
			||||||
                if ($faves->id < $notice->id) {
 | 
					            // If it's in the list, then it's a fave
 | 
				
			||||||
                    // If we passed it, it's not a fave
 | 
					
 | 
				
			||||||
                    return false;
 | 
					            if (in_array($notice->id, $ids)) {
 | 
				
			||||||
                } else if ($faves->id == $notice->id) {
 | 
					 | 
				
			||||||
                    // If it matches a cached notice, then it's a fave
 | 
					 | 
				
			||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
                $cnt++;
 | 
					
 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            // If we're not past the end of the cache window,
 | 
					            // If we're not past the end of the cache window,
 | 
				
			||||||
            // then the cache has all available faves, so this one
 | 
					            // then the cache has all available faves, so this one
 | 
				
			||||||
            // is not a fave.
 | 
					            // is not a fave.
 | 
				
			||||||
            if ($cnt < NOTICE_CACHE_WINDOW) {
 | 
					
 | 
				
			||||||
 | 
					            if (count($ids) < NOTICE_CACHE_WINDOW) {
 | 
				
			||||||
                return false;
 | 
					                return false;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // Otherwise, cache doesn't have all faves;
 | 
					            // Otherwise, cache doesn't have all faves;
 | 
				
			||||||
            // fall through to the default
 | 
					            // fall through to the default
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $fave = Fave::pkeyGet(array('user_id' => $this->id,
 | 
					        $fave = Fave::pkeyGet(array('user_id' => $this->id,
 | 
				
			||||||
                                    'notice_id' => $notice->id));
 | 
					                                    'notice_id' => $notice->id));
 | 
				
			||||||
        return ((is_null($fave)) ? false : true);
 | 
					        return ((is_null($fave)) ? false : true);
 | 
				
			||||||
@@ -401,13 +402,9 @@ class User extends Memcached_DataObject
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    function getReplies($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=null)
 | 
					    function getReplies($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=null)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $qry =
 | 
					        $ids = Reply::stream($this->id, $offset, $limit, $since_id, $before_id, $since);
 | 
				
			||||||
          'SELECT notice.* ' .
 | 
					        common_debug("Ids = " . implode(',', $ids));
 | 
				
			||||||
          'FROM notice JOIN reply ON notice.id = reply.notice_id ' .
 | 
					        return Notice::getStreamByIds($ids);
 | 
				
			||||||
          'WHERE reply.profile_id = %d ';
 | 
					 | 
				
			||||||
        return Notice::getStream(sprintf($qry, $this->id),
 | 
					 | 
				
			||||||
                                 'user:replies:'.$this->id,
 | 
					 | 
				
			||||||
                                 $offset, $limit, $since_id, $before_id, null, $since);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=null)
 | 
					    function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=null)
 | 
				
			||||||
@@ -422,13 +419,8 @@ class User extends Memcached_DataObject
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    function favoriteNotices($offset=0, $limit=NOTICES_PER_PAGE)
 | 
					    function favoriteNotices($offset=0, $limit=NOTICES_PER_PAGE)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $qry =
 | 
					        $ids = Fave::stream($this->id, $offset, $limit);
 | 
				
			||||||
          'SELECT notice.* ' .
 | 
					        return Notice::getStreamByIds($ids);
 | 
				
			||||||
          'FROM notice JOIN fave ON notice.id = fave.notice_id ' .
 | 
					 | 
				
			||||||
          'WHERE fave.user_id = %d ';
 | 
					 | 
				
			||||||
        return Notice::getStream(sprintf($qry, $this->id),
 | 
					 | 
				
			||||||
                                 'user:faves:'.$this->id,
 | 
					 | 
				
			||||||
                                 $offset, $limit);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function noticesWithFriends($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=null)
 | 
					    function noticesWithFriends($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=null)
 | 
				
			||||||
@@ -463,8 +455,8 @@ class User extends Memcached_DataObject
 | 
				
			|||||||
        if ($cache) {
 | 
					        if ($cache) {
 | 
				
			||||||
            // Faves don't happen chronologically, so we need to blow
 | 
					            // Faves don't happen chronologically, so we need to blow
 | 
				
			||||||
            // ;last cache, too
 | 
					            // ;last cache, too
 | 
				
			||||||
            $cache->delete(common_cache_key('user:faves:'.$this->id));
 | 
					            $cache->delete(common_cache_key('fave:ids_by_user:'.$this->id));
 | 
				
			||||||
            $cache->delete(common_cache_key('user:faves:'.$this->id).';last');
 | 
					            $cache->delete(common_cache_key('fave:ids_by_user:'.$this->id.';last'));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -50,13 +50,50 @@ class User_group extends Memcached_DataObject
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    function getNotices($offset, $limit)
 | 
					    function getNotices($offset, $limit)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $qry =
 | 
					        $ids = Notice::stream(array($this, '_streamDirect'),
 | 
				
			||||||
          'SELECT notice.* ' .
 | 
					                              array(),
 | 
				
			||||||
          'FROM notice JOIN group_inbox ON notice.id = group_inbox.notice_id ' .
 | 
					                              'user_group:notice_ids:' . $this->id,
 | 
				
			||||||
          'WHERE group_inbox.group_id = %d ';
 | 
					 | 
				
			||||||
        return Notice::getStream(sprintf($qry, $this->id),
 | 
					 | 
				
			||||||
                                 'group:notices:'.$this->id,
 | 
					 | 
				
			||||||
                              $offset, $limit);
 | 
					                              $offset, $limit);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return Notice::getStreamByIds($ids);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function _streamDirect($offset, $limit, $since_id, $before_id, $since)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $inbox = new Group_inbox();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $inbox->group_id = $this->id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $inbox->selectAdd();
 | 
				
			||||||
 | 
					        $inbox->selectAdd('notice_id');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($since_id != 0) {
 | 
				
			||||||
 | 
					            $inbox->whereAdd('notice_id > ' . $since_id);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($before_id != 0) {
 | 
				
			||||||
 | 
					            $inbox->whereAdd('notice_id < ' . $before_id);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!is_null($since)) {
 | 
				
			||||||
 | 
					            $inbox->whereAdd('created > \'' . date('Y-m-d H:i:s', $since) . '\'');
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $inbox->orderBy('notice_id DESC');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!is_null($offset)) {
 | 
				
			||||||
 | 
					            $inbox->limit($offset, $limit);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $ids = array();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ($inbox->find()) {
 | 
				
			||||||
 | 
					            while ($inbox->fetch()) {
 | 
				
			||||||
 | 
					                $ids[] = $inbox->notice_id;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $ids;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function allowedNickname($nickname)
 | 
					    function allowedNickname($nickname)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -291,6 +291,8 @@ create table foreign_link (
 | 
				
			|||||||
     noticesync int not null default 1 /* comment 'notice synchronisation, bit 1 = sync outgoing, bit 2 = sync incoming, bit 3 = filter local replies' */,
 | 
					     noticesync int not null default 1 /* comment 'notice synchronisation, bit 1 = sync outgoing, bit 2 = sync incoming, bit 3 = filter local replies' */,
 | 
				
			||||||
     friendsync int not null default 2 /* comment 'friend synchronisation, bit 1 = sync outgoing, bit 2 = sync incoming */, 
 | 
					     friendsync int not null default 2 /* comment 'friend synchronisation, bit 1 = sync outgoing, bit 2 = sync incoming */, 
 | 
				
			||||||
     profilesync int not null default 1 /* comment 'profile synchronization, bit 1 = sync outgoing, bit 2 = sync incoming' */,
 | 
					     profilesync int not null default 1 /* comment 'profile synchronization, bit 1 = sync outgoing, bit 2 = sync incoming' */,
 | 
				
			||||||
 | 
					     last_noticesync timestamp default null /* comment 'last time notices were imported' */,
 | 
				
			||||||
 | 
					     last_friendsync timestamp default null /* comment 'last time friends were imported' */,
 | 
				
			||||||
     created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */,
 | 
					     created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */,
 | 
				
			||||||
     modified timestamp /* comment 'date this record was modified' */,
 | 
					     modified timestamp /* comment 'date this record was modified' */,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,6 +24,7 @@ VALUES
 | 
				
			|||||||
    ('peoplebrowsr', 'PeopleBrowsr', 'http://www.peoplebrowsr.com/', now()),
 | 
					    ('peoplebrowsr', 'PeopleBrowsr', 'http://www.peoplebrowsr.com/', now()),
 | 
				
			||||||
    ('Pikchur','Pikchur','http://www.pikchur.com/', now()),
 | 
					    ('Pikchur','Pikchur','http://www.pikchur.com/', now()),
 | 
				
			||||||
    ('Ping.fm','Ping.fm','http://ping.fm/', now()),
 | 
					    ('Ping.fm','Ping.fm','http://ping.fm/', now()),
 | 
				
			||||||
 | 
					    ('pingvine','PingVine','http://pingvine.com/', now()),
 | 
				
			||||||
    ('pocketwit','PockeTwit','http://code.google.com/p/pocketwit/', now()),
 | 
					    ('pocketwit','PockeTwit','http://code.google.com/p/pocketwit/', now()),
 | 
				
			||||||
    ('posty','Posty','http://spreadingfunkyness.com/posty/', now()),
 | 
					    ('posty','Posty','http://spreadingfunkyness.com/posty/', now()),
 | 
				
			||||||
    ('royalewithcheese','Royale With Cheese','http://p.hellyeah.org/', now()),
 | 
					    ('royalewithcheese','Royale With Cheese','http://p.hellyeah.org/', now()),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -45,9 +45,11 @@ class CometPlugin extends Plugin
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    var $server = null;
 | 
					    var $server = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function __construct($server=null)
 | 
					    function __construct($server=null, $username=null, $password=null)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $this->server   = $server;
 | 
					        $this->server   = $server;
 | 
				
			||||||
 | 
					        $this->username = $username;
 | 
				
			||||||
 | 
					        $this->password = $password;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        parent::__construct();
 | 
					        parent::__construct();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -82,8 +84,22 @@ class CometPlugin extends Plugin
 | 
				
			|||||||
                         ' ');
 | 
					                         ' ');
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $user = common_current_user();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!empty($user->id)) {
 | 
				
			||||||
 | 
					            $user_id = $user->id;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            $user_id = 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $replyurl = common_local_url('newnotice');
 | 
				
			||||||
 | 
					        $favorurl = common_local_url('favor');
 | 
				
			||||||
 | 
					        // FIXME: need to find a better way to pass this pattern in
 | 
				
			||||||
 | 
					        $deleteurl = common_local_url('deletenotice',
 | 
				
			||||||
 | 
					                                      array('notice' => '0000000000'));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $action->elementStart('script', array('type' => 'text/javascript'));
 | 
					        $action->elementStart('script', array('type' => 'text/javascript'));
 | 
				
			||||||
        $action->raw("$(document).ready(function() { updater.init(\"$this->server\", \"$timeline\");});");
 | 
					        $action->raw("$(document).ready(function() { updater.init(\"$this->server\", \"$timeline\", $user_id, \"$replyurl\", \"$favorurl\", \"$deleteurl\"); });");
 | 
				
			||||||
        $action->elementEnd('script');
 | 
					        $action->elementEnd('script');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
@@ -117,7 +133,7 @@ class CometPlugin extends Plugin
 | 
				
			|||||||
            $json = $this->noticeAsJson($notice);
 | 
					            $json = $this->noticeAsJson($notice);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // Bayeux? Comet? Huh? These terms confuse me
 | 
					            // Bayeux? Comet? Huh? These terms confuse me
 | 
				
			||||||
            $bay = new Bayeux($this->server);
 | 
					            $bay = new Bayeux($this->server, $this->user, $this->password);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            foreach ($timelines as $timeline) {
 | 
					            foreach ($timelines as $timeline) {
 | 
				
			||||||
                $this->log(LOG_INFO, "Posting notice $notice->id to '$timeline'.");
 | 
					                $this->log(LOG_INFO, "Posting notice $notice->id to '$timeline'.");
 | 
				
			||||||
@@ -144,6 +160,15 @@ class CometPlugin extends Plugin
 | 
				
			|||||||
        $arr = $act->twitter_status_array($notice, true);
 | 
					        $arr = $act->twitter_status_array($notice, true);
 | 
				
			||||||
        $arr['url'] = $notice->bestUrl();
 | 
					        $arr['url'] = $notice->bestUrl();
 | 
				
			||||||
        $arr['html'] = htmlspecialchars($notice->rendered);
 | 
					        $arr['html'] = htmlspecialchars($notice->rendered);
 | 
				
			||||||
 | 
					        $arr['source'] = htmlspecialchars($arr['source']);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!empty($notice->reply_to)) {
 | 
				
			||||||
 | 
					            $reply_to = Notice::staticGet('id', $notice->reply_to);
 | 
				
			||||||
 | 
					            if (!empty($reply_to)) {
 | 
				
			||||||
 | 
					                $arr['in_reply_to_status_url'] = $reply_to->bestUrl();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            $reply_to = null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $profile = $notice->getProfile();
 | 
					        $profile = $notice->getProfile();
 | 
				
			||||||
        $arr['user']['profile_url'] = $profile->profileurl;
 | 
					        $arr['user']['profile_url'] = $profile->profileurl;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,9 +26,12 @@ class Bayeux
 | 
				
			|||||||
    private $oCurl = '';
 | 
					    private $oCurl = '';
 | 
				
			||||||
    private $nNextId = 0;
 | 
					    private $nNextId = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private $sUser = '';
 | 
				
			||||||
 | 
					    private $sPassword = '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public $sUrl = '';
 | 
					    public $sUrl = '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function __construct($sUrl)
 | 
					    function __construct($sUrl, $sUser='', $sPassword='')
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $this->sUrl = $sUrl;
 | 
					        $this->sUrl = $sUrl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -43,6 +46,10 @@ class Bayeux
 | 
				
			|||||||
        curl_setopt($this->oCurl, CURLOPT_POST, 1);
 | 
					        curl_setopt($this->oCurl, CURLOPT_POST, 1);
 | 
				
			||||||
        curl_setopt($this->oCurl, CURLOPT_RETURNTRANSFER,1);
 | 
					        curl_setopt($this->oCurl, CURLOPT_RETURNTRANSFER,1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!is_null($sUser) && mb_strlen($sUser) > 0) {
 | 
				
			||||||
 | 
					            curl_setopt($this->oCurl, CURLOPT_USERPWD,"$sUser:$sPassword");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $this->handShake();
 | 
					        $this->handShake();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,14 +3,26 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
var updater = function()
 | 
					var updater = function()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					     var _server;
 | 
				
			||||||
 | 
					     var _timeline;
 | 
				
			||||||
 | 
					     var _userid;
 | 
				
			||||||
 | 
					     var _replyurl;
 | 
				
			||||||
 | 
					     var _favorurl;
 | 
				
			||||||
 | 
					     var _deleteurl;
 | 
				
			||||||
     var _cometd;
 | 
					     var _cometd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
     return {
 | 
					     return {
 | 
				
			||||||
          init: function(server, timeline)
 | 
					          init: function(server, timeline, userid, replyurl, favorurl, deleteurl)
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
               _cometd = $.cometd; // Uses the default Comet object
 | 
					               _cometd = $.cometd; // Uses the default Comet object
 | 
				
			||||||
               _cometd.setLogLevel('debug');
 | 
					               _cometd.setLogLevel('debug');
 | 
				
			||||||
               _cometd.init(server);
 | 
					               _cometd.init(server);
 | 
				
			||||||
 | 
					               _server = server;
 | 
				
			||||||
 | 
					               _timeline = timeline;
 | 
				
			||||||
 | 
					               _userid = userid;
 | 
				
			||||||
 | 
					               _favorurl = favorurl;
 | 
				
			||||||
 | 
					               _replyurl = replyurl;
 | 
				
			||||||
 | 
					               _deleteurl = deleteurl;
 | 
				
			||||||
               _cometd.subscribe(timeline, receive);
 | 
					               _cometd.subscribe(timeline, receive);
 | 
				
			||||||
               $(window).unload(leave);
 | 
					               $(window).unload(leave);
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@@ -34,7 +46,7 @@ var updater = function()
 | 
				
			|||||||
          var noticeItem = makeNoticeItem(message.data);
 | 
					          var noticeItem = makeNoticeItem(message.data);
 | 
				
			||||||
          $("#notices_primary .notices").prepend(noticeItem, true);
 | 
					          $("#notices_primary .notices").prepend(noticeItem, true);
 | 
				
			||||||
          $("#notices_primary .notice:first").css({display:"none"});
 | 
					          $("#notices_primary .notice:first").css({display:"none"});
 | 
				
			||||||
          $("#notices_primary .notice:first").fadeIn(2500);
 | 
					          $("#notices_primary .notice:first").fadeIn(1000);
 | 
				
			||||||
          NoticeHover();
 | 
					          NoticeHover();
 | 
				
			||||||
          NoticeReply();
 | 
					          NoticeReply();
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
@@ -42,7 +54,8 @@ var updater = function()
 | 
				
			|||||||
     function makeNoticeItem(data)
 | 
					     function makeNoticeItem(data)
 | 
				
			||||||
     {
 | 
					     {
 | 
				
			||||||
          user = data['user'];
 | 
					          user = data['user'];
 | 
				
			||||||
          html = data['html'].replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
 | 
					          html = data['html'].replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"');
 | 
				
			||||||
 | 
					          source = data['source'].replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          ni = "<li class=\"hentry notice\" id=\"notice-"+data['id']+"\">"+
 | 
					          ni = "<li class=\"hentry notice\" id=\"notice-"+data['id']+"\">"+
 | 
				
			||||||
               "<div class=\"entry-title\">"+
 | 
					               "<div class=\"entry-title\">"+
 | 
				
			||||||
@@ -65,13 +78,77 @@ var updater = function()
 | 
				
			|||||||
               "</dl>"+
 | 
					               "</dl>"+
 | 
				
			||||||
               "<dl class=\"device\">"+
 | 
					               "<dl class=\"device\">"+
 | 
				
			||||||
               "<dt>From</dt> "+
 | 
					               "<dt>From</dt> "+
 | 
				
			||||||
               "<dd>"+data['source']+"</dd>"+
 | 
					               "<dd>"+source+"</dd>"+ // may have a link, I think
 | 
				
			||||||
               "</dl>"+
 | 
					               "</dl>";
 | 
				
			||||||
               "</div>"+
 | 
					
 | 
				
			||||||
               "<div class=\"notice-options\">"+
 | 
					          if (data['in_reply_to_status_id']) {
 | 
				
			||||||
               "</div>"+
 | 
					               ni = ni+" <dl class=\"response\">"+
 | 
				
			||||||
 | 
					                    "<dt>To</dt>"+
 | 
				
			||||||
 | 
					                    "<dd>"+
 | 
				
			||||||
 | 
					                    "<a href=\""+data['in_reply_to_status_url']+"\" rel=\"in-reply-to\">in reply to</a>"+
 | 
				
			||||||
 | 
					                    "</dd>"+
 | 
				
			||||||
 | 
					                    "</dl>";
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          ni = ni+"</div>"+
 | 
				
			||||||
 | 
					               "<div class=\"notice-options\">";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          if (_userid != 0) {
 | 
				
			||||||
 | 
					               var input = $("form#form_notice fieldset input#token");
 | 
				
			||||||
 | 
					               var session_key = input.val();
 | 
				
			||||||
 | 
					               ni = ni+makeFavoriteForm(data['id'], session_key);
 | 
				
			||||||
 | 
					               ni = ni+makeReplyLink(data['id'], data['user']['screen_name']);
 | 
				
			||||||
 | 
					               if (_userid == data['user']['id']) {
 | 
				
			||||||
 | 
					                    ni = ni+makeDeleteLink(data['id']);
 | 
				
			||||||
 | 
					               }
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          ni = ni+"</div>"+
 | 
				
			||||||
               "</li>";
 | 
					               "</li>";
 | 
				
			||||||
          return ni;
 | 
					          return ni;
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     function makeFavoriteForm(id, session_key)
 | 
				
			||||||
 | 
					     {
 | 
				
			||||||
 | 
					          var ff;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          ff = "<form id=\"favor-"+id+"\" class=\"form_favor\" method=\"post\" action=\""+_favorurl+"\">"+
 | 
				
			||||||
 | 
					               "<fieldset>"+
 | 
				
			||||||
 | 
					               "<legend>Favor this notice</legend>"+ // XXX: i18n
 | 
				
			||||||
 | 
					               "<input name=\"token-"+id+"\" type=\"hidden\" id=\"token-"+id+"\" value=\""+session_key+"\"/>"+
 | 
				
			||||||
 | 
					               "<input name=\"notice\" type=\"hidden\" id=\"notice-n"+id+"\" value=\""+id+"\"/>"+
 | 
				
			||||||
 | 
					               "<input type=\"submit\" id=\"favor-submit-"+id+"\" name=\"favor-submit-"+id+"\" class=\"submit\" value=\"Favor\" title=\"Favor this notice\"/>"+
 | 
				
			||||||
 | 
					               "</fieldset>"+
 | 
				
			||||||
 | 
					               "</form>";
 | 
				
			||||||
 | 
					          return ff;
 | 
				
			||||||
 | 
					     }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     function makeReplyLink(id, nickname)
 | 
				
			||||||
 | 
					     {
 | 
				
			||||||
 | 
					          var rl;
 | 
				
			||||||
 | 
					          rl = "<dl class=\"notice_reply\">"+
 | 
				
			||||||
 | 
					               "<dt>Reply to this notice</dt>"+
 | 
				
			||||||
 | 
					               "<dd>"+
 | 
				
			||||||
 | 
					               "<a href=\""+_replyurl+"?replyto="+nickname+"\" title=\"Reply to this notice\">Reply <span class=\"notice_id\">"+id+"</span>"+
 | 
				
			||||||
 | 
					               "</a>"+
 | 
				
			||||||
 | 
					               "</dd>"+
 | 
				
			||||||
 | 
					               "</dl>";
 | 
				
			||||||
 | 
					          return rl;
 | 
				
			||||||
 | 
					     }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     function makeDeleteLink(id)
 | 
				
			||||||
 | 
					     {
 | 
				
			||||||
 | 
					          var dl, delurl;
 | 
				
			||||||
 | 
					          delurl = _deleteurl.replace("0000000000", id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          dl = "<dl class=\"notice_delete\">"+
 | 
				
			||||||
 | 
					               "<dt>Delete this notice</dt>"+
 | 
				
			||||||
 | 
					               "<dd>"+
 | 
				
			||||||
 | 
					               "<a href=\""+delurl+"\" title=\"Delete this notice\">Delete</a>"+
 | 
				
			||||||
 | 
					               "</dd>"+
 | 
				
			||||||
 | 
					               "</dl>";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          return dl;
 | 
				
			||||||
 | 
					     }
 | 
				
			||||||
}();
 | 
					}();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,8 +32,25 @@ define('LACONICA', true);
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
require_once(INSTALLDIR . '/lib/common.php');
 | 
					require_once(INSTALLDIR . '/lib/common.php');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Make a lockfile
 | 
				
			||||||
 | 
					$lockfilename = lockFilename();
 | 
				
			||||||
 | 
					if (!($lockfile = @fopen($lockfilename, "w"))) {
 | 
				
			||||||
 | 
					    print "Already running... exiting.\n";
 | 
				
			||||||
 | 
					    exit(1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Obtain an exlcusive lock on file (will fail if script is already going)
 | 
				
			||||||
 | 
					if (!@flock( $lockfile, LOCK_EX | LOCK_NB, &$wouldblock) || $wouldblock) {
 | 
				
			||||||
 | 
					    // Script already running - abort
 | 
				
			||||||
 | 
					    @fclose($lockfile);
 | 
				
			||||||
 | 
					    print "Already running... exiting.\n";
 | 
				
			||||||
 | 
					    exit(1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$flink = new Foreign_link();
 | 
					$flink = new Foreign_link();
 | 
				
			||||||
$flink->service = 1; // Twitter
 | 
					$flink->service = 1; // Twitter
 | 
				
			||||||
 | 
					$flink->orderBy('last_friendsync');
 | 
				
			||||||
 | 
					$flink->limit(25);  // sync this many users during this run
 | 
				
			||||||
$cnt = $flink->find();
 | 
					$cnt = $flink->find();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
print "Updating Twitter friends subscriptions for $cnt users.\n";
 | 
					print "Updating Twitter friends subscriptions for $cnt users.\n";
 | 
				
			||||||
@@ -60,8 +77,11 @@ while ($flink->fetch()) {
 | 
				
			|||||||
            continue;
 | 
					            continue;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $result = save_twitter_friends($user, $fuser->id,
 | 
					        save_twitter_friends($user, $fuser->id, $fuser->nickname, $flink->credentials);
 | 
				
			||||||
                       $fuser->nickname, $flink->credentials);
 | 
					
 | 
				
			||||||
 | 
					        $flink->last_friendsync = common_sql_now();
 | 
				
			||||||
 | 
					        $flink->update();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (defined('SCRIPT_DEBUG')) {
 | 
					        if (defined('SCRIPT_DEBUG')) {
 | 
				
			||||||
            print "\nDONE\n";
 | 
					            print "\nDONE\n";
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
@@ -70,4 +90,18 @@ while ($flink->fetch()) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function lockFilename()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    $piddir = common_config('daemon', 'piddir');
 | 
				
			||||||
 | 
					    if (!$piddir) {
 | 
				
			||||||
 | 
					        $piddir = '/var/run';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return $piddir . '/synctwitterfriends.lock';
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Cleanup
 | 
				
			||||||
 | 
					fclose($lockfile);
 | 
				
			||||||
 | 
					unlink($lockfilename);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exit(0);
 | 
					exit(0);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user