diff --git a/README b/README
index 07537a7c1d..aacc9670e6 100644
--- a/README
+++ b/README
@@ -2,8 +2,8 @@
README
------
-StatusNet 1.0.0rc1
-20 September 2011
+StatusNet 1.0.0
+30 September 2011
This is the README file for StatusNet, the Open Source social
networking platform. It includes general information about the
@@ -197,6 +197,7 @@ Feedback
place to discuss the software.
* StatusNet has a bug tracker for any defects you may find, or ideas for
making things better. http://status.net/open-source/issues
+* The StatusNet forum is at http://forum.status.net/.
Credits
=======
diff --git a/actions/doc.php b/actions/doc.php
index 95f76fb9dd..c26b290902 100644
--- a/actions/doc.php
+++ b/actions/doc.php
@@ -162,4 +162,72 @@ class DocAction extends Action
Event::handle('EndLoadDoc', array($this->title, &$this->output));
}
}
+
+ function showLocalNav()
+ {
+ $menu = new DocNav($this);
+ $menu->show();
+ }
+}
+
+class DocNav extends Menu
+{
+ function show()
+ {
+ $stub = new HomeStubNav($this->action);
+ $this->submenu(_m('MENU','Home'), $stub);
+
+ $docs = new DocListNav($this->action);
+ $this->submenu(_m('MENU','Docs'), $docs);
+ }
+}
+
+class DocListNav extends Menu
+{
+ function getItems()
+ {
+ $items = array();
+
+ if (Event::handle('StartDocsMenu', array(&$items))) {
+
+ $items = array(array('doc',
+ array('title' => 'help'),
+ _m('MENU', 'Help'),
+ _('Getting started'),
+ 'nav_doc_help'),
+ array('doc',
+ array('title' => 'about'),
+ _m('MENU', 'About'),
+ _('About this site'),
+ 'nav_doc_about'),
+ array('doc',
+ array('title' => 'faq'),
+ _m('MENU', 'FAQ'),
+ _('Frequently asked questions'),
+ 'nav_doc_faq'),
+ array('doc',
+ array('title' => 'contact'),
+ _m('MENU', 'Contact'),
+ _('Contact info'),
+ 'nav_doc_contact'),
+ array('doc',
+ array('title' => 'tags'),
+ _m('MENU', 'Tags'),
+ _('Using tags'),
+ 'nav_doc_tags'),
+ array('doc',
+ array('title' => 'groups'),
+ _m('MENU', 'Groups'),
+ _('Using groups'),
+ 'nav_doc_groups'),
+ array('doc',
+ array('title' => 'api'),
+ _m('MENU', 'API'),
+ _('RESTful API'),
+ 'nav_doc_api'));
+
+ Event::handle('EndDocsMenu', array(&$items));
+ }
+ return $items;
+ }
}
diff --git a/classes/Managed_DataObject.php b/classes/Managed_DataObject.php
index 106065fc46..1d55537e20 100644
--- a/classes/Managed_DataObject.php
+++ b/classes/Managed_DataObject.php
@@ -168,4 +168,38 @@ abstract class Managed_DataObject extends Memcached_DataObject
}
return $links;
}
+
+ /**
+ * Return a list of all primary/unique keys / vals that will be used for
+ * caching. This will understand compound unique keys, which
+ * Memcached_DataObject doesn't have enough info to handle properly.
+ *
+ * @return array of strings
+ */
+ function _allCacheKeys()
+ {
+ $table = call_user_func(array(get_class($this), 'schemaDef'));
+ $ckeys = array();
+
+ if (!empty($table['unique keys'])) {
+ $keyNames = $table['unique keys'];
+ foreach ($keyNames as $idx => $fields) {
+ $val = array();
+ foreach ($fields as $name) {
+ $val[$name] = self::valueString($this->$name);
+ }
+ $ckeys[] = self::multicacheKey($this->tableName(), $val);
+ }
+ }
+
+ if (!empty($table['primary key'])) {
+ $fields = $table['primary key'];
+ $val = array();
+ foreach ($fields as $name) {
+ $val[$name] = self::valueString($this->$name);
+ }
+ $ckeys[] = self::multicacheKey($this->tableName(), $val);
+ }
+ return $ckeys;
+ }
}
\ No newline at end of file
diff --git a/classes/User_im_prefs.php b/classes/User_im_prefs.php
index cc9dea608d..90df216c54 100644
--- a/classes/User_im_prefs.php
+++ b/classes/User_im_prefs.php
@@ -80,26 +80,4 @@ class User_im_prefs extends Managed_DataObject
);
}
- /**
- * We have two compound keys with unique constraints:
- * (transport, user_id) which is our primary key, and
- * (transport, screenname) which is an additional constraint.
- *
- * Currently there's not a way to represent that second key
- * in the general keys list, so we're adding it here to the
- * list of keys to use for caching, ensuring that it gets
- * cleared as well when we change.
- *
- * @return array of cache keys
- */
- function _allCacheKeys()
- {
- $ukeys = 'transport,screenname';
- $uvals = $this->transport . ',' . $this->screenname;
-
- $ckeys = parent::_allCacheKeys();
- $ckeys[] = $this->cacheKey($this->tableName(), $ukeys, $uvals);
- return $ckeys;
- }
-
}
diff --git a/doc-src/about b/doc-src/about
index 5645c2cebe..e037b61692 100644
--- a/doc-src/about
+++ b/doc-src/about
@@ -2,13 +2,15 @@
-%%site.name%% is a
-[micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service
-based on the Free Software [StatusNet](http://status.net/) tool.
+%%site.name%% is a stream-oriented social network service based on the
+Free Software [StatusNet](http://status.net/) tool.
-If you [register](%%action.register%%) for an account,
-you can post small (%%site.textlimit%% chars or less) text notices
-about yourself, where you are, what you're doing, or practically
-anything you want. You can also subscribe to the notices of your
-friends, or other people you're interested in, and follow them on the
-Web or in an [RSS](http://en.wikipedia.org/wiki/RSS) feed.
+If you [register](%%action.register%%) for an account, you can post
+small (%%site.textlimit%% chars or less) text notices about yourself,
+where you are, what you're doing, what you're working on or what
+you're thinking about. You can also subscribe to the notices of your
+friends, or other people you're interested in, and follow them
+privately or on the Web.
+
+You can also post event invitations, bookmarks, polls, questions, or
+other kinds of data.
diff --git a/doc-src/badge b/doc-src/badge
deleted file mode 100644
index 98cdcfce27..0000000000
--- a/doc-src/badge
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
-
-Install the %%site.name%% badge on your blog or web site to show the latest updates
-from you and your friends!
-
-
- <script type="text/javascript" src="http://identi.ca/js/identica-badge.js"> - { - "user":"kentbrew", - "server":"identi.ca", - "headerText":" and friends" - } - </script> - -- - - -Valid parameters for the badge: -------------------------------- - -* user : defaults to 7000 (@kentbrew) -* headerText : defaults to empty -* height : defaults to 350px -* width : defaults to 300px -* background : defaults to #193441. If you set evenBackground, oddBackground, - and headerBackground, you won't see it at all. -* border : defaults to 1px solid black -* userColor : defaults to whatever link color is set to on your page -* headerBackground : defaults to transparent -* headerColor : defaults to white -* evenBackground : defaults to #fff -* oddBackground : defaults to #eee -* thumbnailBorder : 1px solid black -* thumbnailSize : defaults to 24px -* padding : defaults to 3px -* server : defaults to identi.ca - -Licence -------- - -Identi.ca badge by [Kent Brewster](http://kentbrewster.com/identica-badge/). -Licenced under [CC-BY-SA-3](http://kentbrewster.com/rights-and-permissions/). diff --git a/doc-src/bookmarklet b/doc-src/bookmarklet deleted file mode 100644 index 0b77bf45a7..0000000000 --- a/doc-src/bookmarklet +++ /dev/null @@ -1,9 +0,0 @@ - - - - -A bookmarklet is a small piece of javascript code used as a bookmark. This one will let you post to %%site.name%% simply by selecting some text on a page and pressing the bookmarklet. - -Drag-and-drop the following link to your bookmarks bar or right-click it and add it to your browser favorites to keep it handy. - -Post to %%site.name%% diff --git a/doc-src/contact b/doc-src/contact index a713d7c5b9..4b31439c42 100644 --- a/doc-src/contact +++ b/doc-src/contact @@ -5,14 +5,6 @@ There are a number of options for getting in contact with responsible people for %%site.name%%. -Post a notice -------------- - -If you have a question about how to do something, just post a notice -with your question. People here like to answer messages. Watch the -[public timeline](%%action.top%%) for answers; they'll usually start -with "@" plus your user name. - Bugs ---- @@ -25,4 +17,10 @@ Email You can reach the responsible party for this server at [%%site.email%%](mailto:%%site.email%%). +Post a notice +------------- + +If you have a question about how to do something, just post a notice +with your question. Watch your inbox [public timeline](%%action.top%%) +for answers. diff --git a/doc-src/faq b/doc-src/faq index 589b18b8d8..ee7cd506a8 100644 --- a/doc-src/faq +++ b/doc-src/faq @@ -8,39 +8,43 @@ some answers. What is %%site.name%%? ---------------------- -%%site.name%% is a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service. +%%site.name%% is a stream oriented social network service. + You can use it to write short notices about yourself, where you are, and what you're doing, and those notices will be sent to all your friends and fans. -How is %%site.name%% different from Twitter, Jaiku, Pownce, Plurk, others? --------------------------------------------------------------------------- +You can also post event invitations, bookmarks, polls, and questions or +other kinds of social broadcasts. -%%site.name%% is an [Open Network Service](http://opendefinition.org/ossd). Our main -goal is to provide a fair and transparent service that preserves users' autonomy. In -particular, all the software used for %%site.name%% is [Free Software](http://en.wikipedia.org/wiki/Free_Software), and all the data is available -under the [%%license.title%%](%%license.url%%) license, making it Open Data. +How is %%site.name%% different from Twitter? +-------------------------------------------- -The software also implements the [OpenMicroBlogging](http://openmicroblogging.org/) protocol, meaning that you can have friends on other microblogging services -that can receive your notices. +Like [Twitter](http://twitter.com/), %%site.name%% is a light service +with a stream-oriented interface. It uses @-replies, hashtags, +provides search, and has private messages. It provides an API, and can +be integrated with SMS systems. You can create lists. -The goal here is *autonomy* -- you deserve the right to manage your own on-line -presence. If you don't like how %%site.name%% works, you can take your data and the source code and set up your own server (or move your account to another one). +Unlike Twitter, %%site.name%% allows more data than just plain text +and links to travel across the network. You can install the StatusNet +software that runs %%site.name%% on your own servers, since it's Free +and Open Source software. You can make groups, and share privately +with those groups. -Where is feature X? -------------------- +You can make your site available only to people you choose. You can +customize it with your own themes and plugins, or download plugins +from the StatusNet site. -The software we run, [StatusNet](http://status.net/), is still in its early stages, -and many features people expect from microblogging sites are not yet implemented. Some important ones that are expected "soon": +How is %%site.name%% different from Yammer, SocialCast, or Salesforce Chatter? +------------------------------------------------------------------------------ -* More [AJAX](http://en.wikipedia.org/wiki/AJAX)-y interface -* Maps -* Cross-post to Pownce, Jaiku, etc. -* Pull messages from Twitter, Pownce, Jaiku, etc. -* [Facebook](http://www.facebook.com/) integration -* Image, video, audio notices - -There is [a list of bugs and features](http://status.net/bugs/) that you may find -interesting. New ideas or complaints are very welcome. +Like some enterprise social software services, StatusNet lets you +share privately with other people in your company. You can use +microapps to post richer kinds of data, use public and private groups +to share with team members, use extended profiles to show more about +yourself and your company, and review groups and users in a directory. +Unlike those other services, StatusNet is free and open source +software. You can install it on your own servers. You can customize +the theme and add plugins. diff --git a/doc-src/groups b/doc-src/groups index 5ff09600ef..823e5b16be 100644 --- a/doc-src/groups +++ b/doc-src/groups @@ -4,7 +4,8 @@ Users on %%site.name%% can create *groups* that other users can join. Groups can be a great way to share information and entertainment with -a group of people who have a common interest or background. +a group of people who have a common interest or background; who work +together on a team; or who have a particular knowledge or skill. You can find out about groups on the server on the [Groups](%%action.groups%%) page. You can join a group by clicking on @@ -13,16 +14,16 @@ the "Join" button either in the group list or on the group's home page. Starting a new group -------------------- -If you want, you can start a new group for friends and people with -common interests. Note that all groups are free for anyone to join. +You can start a new group for friends and colleagues. Note that all +groups are free for anyone to join. To start a new group, use the [new group](%%action.newgroup%%) tool and fill out the form. Describe your group as best you can if you want people to be able to find it. When choosing the nickname for your group, try to keep it short. The -nickname is included in every message to and from the group, so the -less chars the better. Try using acronyms for organizations, or +nickname is sometimes included in messages to and from the group, so +the less chars the better. Try using acronyms for organizations, or airport codes for places (like 'pdx' instead of 'portland'). Sending messages to a group @@ -33,14 +34,22 @@ anywhere in the message. If you have more than one group named, the notice will go to each group. Only members can send notices to a group, and groups do not respond to direct messages (DMs). +You can also select the group from the "To:" drop down when posting. + +You can make a group message private by clicking the "private" button +before posting. + Receiving messages ------------------ New group messages will appear in your inbox, and will also come to your phone or IM client if you've set them up to receive notices. -Remote groups -------------- +Private groups +-------------- -While it's technically possible, this version of StatusNet does not -support remote group membership. +The administrator can make a group private. For a private group, all +notices will marked as private for group members only. Also, +administrators will have to approve all new members to the group. + +Private groups are visible in the group directory. diff --git a/doc-src/help b/doc-src/help index 0e39082ad0..4bb9cd33a2 100644 --- a/doc-src/help +++ b/doc-src/help @@ -2,38 +2,18 @@ -%%site.name%% is a **microblogging service**. Users post short (%%site.textlimit%% -character) notices which are broadcast to their friends and fans using -the Web, RSS, or instant messages. +%%site.name%% is a **social service**. Users can post short +(%%site.textlimit%% character) status messages which are broadcast to +their friends and colleagues on the service and (optionally) onto the Web. + +You can also broadcast other types of data, like bookmarks, event +invitations, polls, and questions. If you'd like to try it out, first [register](%%action.register%%) a new account. Then, on the [public timeline](%%action.top%%), enter your message into the textbox at the top of the page, and click "Send". It will go out on the -public timeline and to anyone who is subscribed to your notices (probably nobody, -at first). +public timeline and to anyone who is subscribed to your notices. To subscribe to other people's notifications, go to their profile page and click the "subscribe" button. They'll get a notice that you're now -subscribed to their notifications, and, who knows?, they might subscribe -back. - -More help ---------- - -Here are some documents that you might find helpful in understanding -%%site.name%% and how to use it. - -* [About](%%doc.about%%) - an overview of the service -* [FAQ](%%doc.faq%%) - frequently-asked questions about %%site.name%% -* [Contact](%%doc.contact%%) - who to contact with questions about the service -* [IM](%%doc.im%%) - using the instant-message (IM) features of %%site.name%% -* [SMS](%%doc.sms%%) - tying your cellphone to %%site.name%% -* [Tags](%%doc.tags%%) - different ways to use tagging -* [Groups](%%doc.groups%%) - joining together in groups -* [Lists](%%doc.lists%%) - organize your contacts -* [OpenMicroBlogging](%%doc.openmublog%%) - subscribing to remote users -* [Privacy](%%doc.privacy%%) - %%site.name%%'s privacy policy -* [Source](%%doc.source%%) - How to get the StatusNet source code -* [Badge](%%doc.badge%%) - How to put a StatusNet badge on your blog or homepage -* [Bookmarklet](%%doc.bookmarklet%%) - Bookmarklet for posting Web pages -* [API](%%doc.api%%) - API for use by external clients +subscribed to their notifications. diff --git a/doc-src/lists b/doc-src/lists deleted file mode 100644 index 01c5d3b65f..0000000000 --- a/doc-src/lists +++ /dev/null @@ -1,69 +0,0 @@ - - - - -%%site.name%% supports -[tags](http://en.wikipedia.org/wiki/Tag_(metadata)) to help you -organize your activities here. You can use tags for people and for -notices. - -Tagging a notice ----------------- - -You can tag a notice using a *hashtag*; a # character followed by -letters and numbers as well as '.', '-', and '_'. Note that accented -latin characters are not supported, and non-roman scripts are right out. - -The HTML for the notice will link to a stream of all the other notices -with that tag. This can be a great way to keep track of a conversation. - -The most popular current tags on the site can be found in the [public -tag cloud](%%action.publictagcloud%%). Their size shows their -popularity and recency. - -Tagging yourself ----------------- - -You can also add tags for yourself on your [profile -settings](%%action.profilesettings%%) page or by using the edit tags -button on your profile page. Use single words to -describe yourself, your experiences and your interest. The tags will -become links on your profile page to a list of all the users on the -site who use that same tag. It can be a nice way to find people who -are related to you geographically or who have a common interest. - -Tagging others --------------- - -You can also tag other users by using the edit tags button next to -their profile. Such tags are called *people tags*. Once you have -created a people tag, you can add or remove users from it using the -tag's edit form. This makes it easy to organize your subscriptions -into groups and sort through them separately. Also, it will let -you create custom lists of people that others can subscribe to. - -You can also send a notice "to the attention of" your subscribers -whom you've marked with a particular tag (note: *not* people who've -marked themselves with that tag). "@#family hello" will send a -notice to all your subscribers you've marked with the tag 'family'. - -Private and public people tags ------------------------------- - -A private people tag is only visible to the creator, it cannot be -subscribed to, but the timeline can be viewed. To create a new -private prepend a '.' to the tag in the tags editing box. To set -an existing public tag as private or vice-versa, go to the tag's -edit page. - -Remote people tags ------------------- - -You can even [tag remote users](%%action.profilesettings%%). Just -enter the remote profile's URI and click on the "Fetch" button to -fetch the profile, you can then add tags and save them. - -Subscribing to the timeline of a people tag on another server also -works. Just copy the URL of the people tag's timeline page to the -[OStatus subscription](%%action.ostatussub%%) form. - diff --git a/doc-src/openmublog b/doc-src/openmublog deleted file mode 100644 index 267ad6e7c4..0000000000 --- a/doc-src/openmublog +++ /dev/null @@ -1,29 +0,0 @@ - - - - -[OpenMicroBlogging](http://openmicroblogging.org/) is a protocol that -lets users of one [microblogging](http://en.wikipedia.org/wiki/microblogging) service -subscribe to notices by users of another service. The protocol, based on -[OAuth](http://oauth.net/), is open and free, and doesn't depend on any -central authority to maintain the federated microblogs. - -The [StatusNet](http://status.net/) software that runs %%site.name%% supports -OpenMicroBlogging 0.1. Anyone can make a new installation of StatusNet on their -own servers, and users of that new installation can subscribe to notices from -%%site.name%%. - -Remote subscription -------------------- - -If you have an account on a remote site that supports OpenMicroBlogging, and you -want to subscribe to the notices of a user on this site, click on the "Subscribe" -link under their avatar on their profile page. This should take you to the -[remote subscription](%%action.remotesubscribe%%) page. Make sure that you've got the -right nickname registered, and enter your profile URL on the other microblogging -service. - -You'll be taken to your microblogging service, where you'll be asked to confirm the -subscription. When you confirm, your service will receive new notifications from -the user on %%site.name%%, and your service will forward them to you (using IM, SMS, -the Web, or whatever else). diff --git a/doc-src/tags b/doc-src/tags index 3e9065a100..8f42b5b752 100644 --- a/doc-src/tags +++ b/doc-src/tags @@ -51,19 +51,3 @@ subscribed to, but the timeline can be viewed. To create a new private prepend a '.' to the tag in the tags editing box. To set an existing public tag as private or vice-versa, go to the tag's edit page. - -The most used public tags are displayed in the -[public people tag cloud](%%action.publicpeopletagcloud%%). Their -size shows their frequency of use. - -Remote people tags ------------------- - -You can even [tag remote users](%%action.profilesettings%%). Just -enter the remote profile's URI and click on the "Fetch" button to -fetch the profile, you can then add tags and save them. - -Subscribing to the timeline of a people tag on another server also -works. Just copy the URL of the people tag's timeline page to the -[OStatus subscription](%%action.ostatussub%%) form. - diff --git a/lib/cache.php b/lib/cache.php index eb4eb66656..59110f74d8 100644 --- a/lib/cache.php +++ b/lib/cache.php @@ -43,11 +43,23 @@ */ class Cache { - var $_items = array(); + /** + * @var array additional in-process cache for web requests; + * disabled on CLI, unsafe for long-running daemons + */ + var $_items = array(); + var $_inlineCache = true; static $_inst = null; const COMPRESSED = 1; + private function __construct() { + // Potentially long-running daemons or maintenance scripts + // should not use an in-process cache as it becomes out of + // date. + $this->_inlineCache = (php_sapi_name() != 'cli'); + } + /** * Singleton constructor * @@ -166,7 +178,7 @@ class Cache common_perf_counter('Cache::get', $key); if (Event::handle('StartCacheGet', array(&$key, &$value))) { - if (array_key_exists($key, $this->_items)) { + if ($this->_inlineCache && array_key_exists($key, $this->_items)) { $value = unserialize($this->_items[$key]); } Event::handle('EndCacheGet', array($key, &$value)); @@ -193,7 +205,9 @@ class Cache if (Event::handle('StartCacheSet', array(&$key, &$value, &$flag, &$expiry, &$success))) { - $this->_items[$key] = serialize($value); + if ($this->_inlineCache) { + $this->_items[$key] = serialize($value); + } $success = true; @@ -244,7 +258,7 @@ class Cache common_perf_counter('Cache::delete', $key); if (Event::handle('StartCacheDelete', array(&$key, &$success))) { - if (array_key_exists($key, $this->_items)) { + if ($this->_inlineCache && array_key_exists($key, $this->_items)) { unset($this->_items[$key]); } $success = true; diff --git a/lib/homestubnav.php b/lib/homestubnav.php new file mode 100644 index 0000000000..e9f4ba2308 --- /dev/null +++ b/lib/homestubnav.php @@ -0,0 +1,61 @@ +. + * + * @category Menu + * @package StatusNet + * @author Evan Prodromou