-<?php\r
-/**\r
- * Elgg wire plugin\r
- * \r
- * Forked from Curverider's version\r
- * \r
- * JHU/APL Contributors:\r
- * Cash Costello\r
- * Clark Updike\r
- * John Norton\r
- * Max Thomas\r
- * Nathan Koterba\r
- */\r
-\r
-register_elgg_event_handler('init', 'system', 'thewire_init');\r
-\r
-function thewire_init() {\r
- global $CONFIG;\r
-\r
- if (!update_subtype('object', 'thewire', 'ElggWire')) {\r
- add_subtype('object', 'thewire', 'ElggWire');\r
- }\r
- \r
- elgg_register_js('elgg.thewire', 'mod/thewire/js/thewire.js', 'footer');\r
-\r
- // add a site navigation item\r
- $item = new ElggMenuItem('thewire', elgg_echo('thewire'), 'thewire/all');\r
- elgg_register_menu_item('site', $item);\r
-\r
- // owner block menu\r
- elgg_register_plugin_hook_handler('register', 'menu:owner_block', 'thewire_owner_block_menu');\r
-\r
- // remove edit and access and add thread, reply, view previous\r
- elgg_register_plugin_hook_handler('register', 'menu:entity', 'thewire_setup_entity_menu_items');\r
- \r
- // Extend system CSS with our own styles, which are defined in the thewire/css view\r
- elgg_extend_view('css', 'thewire/css');\r
-\r
- //extend views\r
- elgg_extend_view('activity/thewire', 'thewire/activity_view');\r
- elgg_extend_view('profile/status', 'thewire/profile_status');\r
- elgg_extend_view('js/initialise_elgg', 'thewire/js/textcounter');\r
-\r
- // Register a page handler, so we can have nice URLs\r
- elgg_register_page_handler('thewire', 'thewire_page_handler');\r
-\r
- // Register a URL handler for thewire posts\r
- elgg_register_entity_url_handler('object', 'thewire', 'thewire_url');\r
-\r
- // Your thewire widget\r
- add_widget_type('thewire', elgg_echo('thewire'), elgg_echo("thewire:widget:desc"));\r
-\r
- // Register entity type\r
- elgg_register_entity_type('object', 'thewire');\r
-\r
- // Register granular notification for this type\r
- register_notification_object('object', 'thewire', elgg_echo('thewire:notify:subject'));\r
-\r
- // Listen to notification events and supply a more useful message\r
- register_plugin_hook('notify:entity:message', 'object', 'thewire_notify_message');\r
-\r
- // Register actions\r
- $action_base = $CONFIG->pluginspath . 'thewire/actions';\r
- register_action("thewire/add", false, "$action_base/add.php");\r
- register_action("thewire/delete", false, "$action_base/delete.php");\r
-\r
- register_plugin_hook('unit_test', 'system', 'thewire_test');\r
-}\r
-\r
-/**\r
- * The wire page handler\r
- *\r
- * Supports:\r
- * thewire/all View site wire posts\r
- * thewire/owner/<username> View this user's wire posts\r
- * thewire/following/<username> View the posts of those this user follows\r
- * thewire/reply/<guid> Reply to a post\r
- * thewire/view/<guid> View a conversation thread\r
- * thewire/tag/<tag> View wire posts tagged with <tag>\r
- *\r
- * @param array $page From the page_handler function\r
- * @return true|false Depending on success\r
- */\r
-function thewire_page_handler($page) {\r
-\r
- $base_dir = elgg_get_plugins_path() . 'thewire/pages/thewire';\r
-\r
- // if just /thewire go to global view in the else statement\r
- if (isset($page[0]) && $page[0]) {\r
-\r
- switch ($page[0]) {\r
- case "all":\r
- include "$base_dir/everyone.php";\r
- break;\r
-\r
- case "friends":\r
- include "$base_dir/friends.php";\r
- break;\r
-\r
- case "owner":\r
- include "$base_dir/owner.php";\r
- break;\r
-\r
- case "thread":\r
- if (isset($page[1])) {\r
- set_input('thread_id', $page[1]);\r
- }\r
- include "$base_dir/thread.php";\r
- break;\r
- case "reply":\r
- if (isset($page[1])) {\r
- set_input('guid', $page[1]);\r
- }\r
- include "$base_dir/reply.php";\r
- break;\r
- case "tag":\r
- if (isset($page[1])) {\r
- set_input('tag', $page[1]);\r
- }\r
- include "$base_dir/tag.php";\r
- break;\r
- case "previous":\r
- if (isset($page[1])) {\r
- set_input('guid', $page[1]);\r
- }\r
- include "$base_dir/previous.php";\r
- break;\r
- }\r
- } else {\r
- include "$base_dir/everyone.php";\r
- }\r
-\r
- return true;\r
-}\r
-\r
-/**\r
- * Override the url for a wire post to return the thread\r
- * \r
- * @param $thewirepost - wire post object\r
- */\r
-function thewire_url($thewirepost) {\r
- global $CONFIG;\r
- return $CONFIG->url . "thewire/view/" . $thewirepost->guid;\r
-}\r
-\r
-/**\r
- * Returns the notification body\r
- *\r
- * @param string $hook\r
- * @param string $entity_type\r
- * @param string $returnvalue\r
- * @param array $params\r
- * @return $string\r
- */\r
-function thewire_notify_message($hook, $entity_type, $returnvalue, $params) {\r
- global $CONFIG;\r
- \r
- $entity = $params['entity'];\r
- if (($entity instanceof ElggEntity) && ($entity->getSubtype() == 'thewire')) {\r
- $descr = $entity->description;\r
- $owner = $entity->getOwnerEntity();\r
- if ($entity->reply) {\r
- // have to do this because of poor design of Elgg notification system\r
- $parent_post = get_entity(get_input('parent_guid'));\r
- if ($parent_post) {\r
- $parent_owner = $parent_post->getOwnerEntity();\r
- }\r
- $body = sprintf(elgg_echo('thewire:notify:reply'), $owner->name, $parent_owner->name);\r
- } else {\r
- $body = sprintf(elgg_echo('thewire:notify:post'), $owner->name);\r
- }\r
- $body .= "\n\n" . $descr . "\n\n";\r
- $body .= elgg_echo('thewire') . ": {$CONFIG->url}thewire";\r
- return $body;\r
- }\r
- return $returnvalue;\r
-}\r
-\r
-/**\r
- * Get an array of hashtags from a text string\r
- * \r
- * @param string $text\r
- * @return array\r
- */\r
-function thewire_get_hashtags($text) {\r
- // beginning of text or white space followed by hashtag\r
- // hashtag must begin with # and contain at least one character not digit, space, or punctuation\r
- $matches = array();\r
- preg_match_all('/(^|[^\w])#(\w*[^\s\d!-\/:-@]+\w*)/', $text, $matches);\r
- return $matches[2];\r
-}\r
-\r
-/**\r
- * Replace urls, hash tags, and @'s by links\r
- * \r
- * @param $text\r
- * @return string\r
- */\r
-function thewire_filter($text) {\r
- global $CONFIG;\r
-\r
- $text = ' ' . $text;\r
-\r
- // email addresses\r
- $text = preg_replace(\r
- '/(^|[^\w])([\w\-\.]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})/i',\r
- '$1<a href="mailto:$2@$3">$2@$3</a>',\r
- $text);\r
-\r
- // links\r
- $text = parse_urls($text);\r
-\r
- // usernames\r
- $text = preg_replace(\r
- '/(^|[^\w])@([\w]+)/',\r
- '$1<a href="' . $CONFIG->wwwroot . 'thewire/owner/$2">@$2</a>',\r
- $text);\r
-\r
- // hashtags\r
- $text = preg_replace(\r
- '/(^|[^\w])#(\w*[^\s\d!-\/:-@]+\w*)/',\r
- '$1<a href="' . $CONFIG->wwwroot . 'thewire/tag/$2">#$2</a>',\r
- $text);\r
-\r
- $text = trim($text);\r
-\r
- return $text;\r
-}\r
-\r
-/**\r
- * Create a new wire post.\r
- *\r
- * @param string $text The post text\r
- * @param int $userid The user's guid\r
- * @param int $access_id Public/private etc\r
- * @param int $parent_guid Parent post guid (if any)\r
- * @param string $method The method (default: 'site')\r
- * @return guid or false if failure\r
- */\r
-function thewire_save_post($text, $userid, $access_id, $parent_guid = 0, $method = "site") {\r
- $post = new ElggObject();\r
-\r
- $post->subtype = "thewire";\r
- $post->owner_guid = $userid;\r
- $post->access_id = $access_id;\r
-\r
- // only 200 characters allowed\r
- $text = elgg_substr($text, 0, 200);\r
-\r
- // no html tags allowed so we escape\r
- $post->description = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8');\r
-\r
- $post->method = $method; //method: site, email, api, ...\r
-\r
- $tags = thewire_get_hashtags($text);\r
- if ($tags) {\r
- $post->tags = $tags;\r
- }\r
-\r
- // must do this before saving so notifications pick up that this is a reply\r
- if ($parent_guid) {\r
- $post->reply = true;\r
- }\r
-\r
- $guid = $post->save();\r
-\r
- // set thread guid\r
- if ($parent_guid) {\r
- $post->addRelationship($parent_guid, 'parent');\r
- \r
- // name conversation threads by guid of first post (works even if first post deleted)\r
- $parent_post = get_entity($parent_guid);\r
- $post->wire_thread = $parent_post->wire_thread;\r
- } else {\r
- // first post in this thread\r
- $post->wire_thread = $guid;\r
- }\r
-\r
- if ($guid) {\r
- add_to_river('river/object/thewire/create', 'create', $post->owner_guid, $post->guid);\r
- }\r
- \r
- return $guid;\r
-}\r
-\r
-/**\r
- * Send notification to poster of parent post if not notified already\r
- *\r
- * @param int $guid\r
- * @param int $parent_guid\r
- * @param ElggUser $user\r
- */\r
-function thewire_send_response_notification($guid, $parent_guid, $user) {\r
- $parent_owner = get_entity($parent_guid)->getOwnerEntity();\r
- $user = get_loggedin_user();\r
-\r
- // check to make sure user is not responding to self\r
- if ($parent_owner->guid != $user->guid) {\r
- // check if parent owner has notification for this user\r
- $send_response = true;\r
- global $NOTIFICATION_HANDLERS;\r
- foreach ($NOTIFICATION_HANDLERS as $method => $foo) {\r
- if (check_entity_relationship($parent_owner->guid, 'notify' . $method, $user->guid)) {\r
- $send_response = false;\r
- }\r
- }\r
-\r
- // create the notification message\r
- if ($send_response) {\r
- // grab same notification message that goes to everyone else\r
- $params = array(\r
- 'entity' => get_entity($guid),\r
- 'method' => "email",\r
- );\r
- $msg = thewire_notify_message("", "", "", $params);\r
-\r
- notify_user(\r
- $parent_owner->guid,\r
- $user->guid,\r
- elgg_echo('thewire:notify:subject'),\r
- $msg);\r
- }\r
- }\r
-}\r
-\r
-/**\r
- * Get the latest wire guid - used for ajax update\r
- * @return guid\r
- */\r
-function thewire_latest_guid() {\r
- $post = elgg_get_entities(array(\r
- 'type' => 'object',\r
- 'subtype' => 'thewire',\r
- 'limit' => 1,\r
- ));\r
- if ($post) {\r
- return $post[0]->guid;\r
- } else {\r
- return 0;\r
- }\r
-}\r
-\r
-/**\r
- * Get the parent of a wire post\r
- * \r
- * @param ElggObject $post\r
- * @return ElggObject or null \r
- */\r
-function thewire_get_parent($post_guid) {\r
- $parents = elgg_get_entities_from_relationship(array(\r
- 'relationship' => 'parent',\r
- 'relationship_guid' => $post_guid,\r
- ));\r
- if ($parents) {\r
- return $parents[0];\r
- }\r
- return null;\r
-}\r
-\r
-/**\r
- * Sets up the entity menu for thewire\r
- *\r
- * Adds reply, thread, and view previous links. Removes edit and access.\r
- *\r
- * @param string $hook\r
- * @param string $type\r
- * @param array $value\r
- * @param array $params\r
- * @return array\r
- */\r
-function thewire_setup_entity_menu_items($hook, $type, $value, $params) {\r
- $handler = elgg_extract('handler', $params, false);\r
- if ($handler != 'thewire') {\r
- return $value;\r
- }\r
-\r
- foreach ($value as $index => $item) {\r
- $name = $item->getName();\r
- if ($name == 'access' || $name == 'edit') {\r
- unset($value[$index]);\r
- }\r
- }\r
-\r
- $entity = $params['entity'];\r
-\r
- if (elgg_is_logged_in()) {\r
- $options = array(\r
- 'name' => 'reply',\r
- 'text' => elgg_echo('thewire:reply'),\r
- 'href' => "thewire/reply/$entity->guid",\r
- 'priority' => 150,\r
- );\r
- $value[] = ElggMenuItem::factory($options);\r
- }\r
-\r
- if ($entity->reply) {\r
- $options = array(\r
- 'name' => 'previous',\r
- 'text' => elgg_echo('thewire:previous'),\r
- 'href' => "thewire/previous/$entity->guid",\r
- 'priority' => 160,\r
- );\r
- $value[] = ElggMenuItem::factory($options);\r
- }\r
-\r
- $options = array(\r
- 'name' => 'thread',\r
- 'text' => elgg_echo('thewire:thread'),\r
- 'href' => "thewire/thread/$entity->wire_thread",\r
- 'priority' => 170,\r
- );\r
- $value[] = ElggMenuItem::factory($options);\r
-\r
- return $value;\r
-}\r
-\r
-/**\r
- * Add a menu item to an ownerblock\r
- */\r
-function thewire_owner_block_menu($hook, $type, $return, $params) {\r
- if (elgg_instanceof($params['entity'], 'user')) {\r
- $url = "thewire/owner/{$params['entity']->username}";\r
- $item = new ElggMenuItem('thewire', elgg_echo('item:object:thewire'), $url);\r
- $return[] = $item;\r
- }\r
-\r
- return $return;\r
-}\r
-\r
-/**\r
- * Runs unit tests for the wire\r
- */\r
-function thewire_test($hook, $type, $value, $params) {\r
- global $CONFIG;\r
- $value[] = $CONFIG->pluginspath . 'thewire/tests/regex.php';\r
- return $value;\r
-}\r
+<?php
+/**
+ * Elgg wire plugin
+ *
+ * Forked from Curverider's version
+ *
+ * JHU/APL Contributors:
+ * Cash Costello
+ * Clark Updike
+ * John Norton
+ * Max Thomas
+ * Nathan Koterba
+ */
+
+register_elgg_event_handler('init', 'system', 'thewire_init');
+
+/**
+ * The Wire initialization
+ */
+function thewire_init() {
+ global $CONFIG;
+
+ if (!update_subtype('object', 'thewire', 'ElggWire')) {
+ add_subtype('object', 'thewire', 'ElggWire');
+ }
+
+ elgg_register_js('elgg.thewire', 'mod/thewire/js/thewire.js', 'footer');
+
+ // add a site navigation item
+ $item = new ElggMenuItem('thewire', elgg_echo('thewire'), 'thewire/all');
+ elgg_register_menu_item('site', $item);
+
+ // owner block menu
+ elgg_register_plugin_hook_handler('register', 'menu:owner_block', 'thewire_owner_block_menu');
+
+ // remove edit and access and add thread, reply, view previous
+ elgg_register_plugin_hook_handler('register', 'menu:entity', 'thewire_setup_entity_menu_items');
+
+ // Extend system CSS with our own styles, which are defined in the thewire/css view
+ elgg_extend_view('css', 'thewire/css');
+
+ //extend views
+ elgg_extend_view('activity/thewire', 'thewire/activity_view');
+ elgg_extend_view('profile/status', 'thewire/profile_status');
+ elgg_extend_view('js/initialise_elgg', 'thewire/js/textcounter');
+
+ // Register a page handler, so we can have nice URLs
+ elgg_register_page_handler('thewire', 'thewire_page_handler');
+
+ // Register a URL handler for thewire posts
+ elgg_register_entity_url_handler('object', 'thewire', 'thewire_url');
+
+ // Your thewire widget
+ add_widget_type('thewire', elgg_echo('thewire'), elgg_echo("thewire:widget:desc"));
+
+ // Register entity type
+ elgg_register_entity_type('object', 'thewire');
+
+ // Register granular notification for this type
+ register_notification_object('object', 'thewire', elgg_echo('thewire:notify:subject'));
+
+ // Listen to notification events and supply a more useful message
+ register_plugin_hook('notify:entity:message', 'object', 'thewire_notify_message');
+
+ // Register actions
+ $action_base = $CONFIG->pluginspath . 'thewire/actions';
+ register_action("thewire/add", false, "$action_base/add.php");
+ register_action("thewire/delete", false, "$action_base/delete.php");
+
+ register_plugin_hook('unit_test', 'system', 'thewire_test');
+}
+
+/**
+ * The wire page handler
+ *
+ * Supports:
+ * thewire/all View site wire posts
+ * thewire/owner/<username> View this user's wire posts
+ * thewire/following/<username> View the posts of those this user follows
+ * thewire/reply/<guid> Reply to a post
+ * thewire/view/<guid> View a conversation thread
+ * thewire/tag/<tag> View wire posts tagged with <tag>
+ *
+ * @param array $page From the page_handler function
+ * @return true|false Depending on success
+ */
+function thewire_page_handler($page) {
+
+ $base_dir = elgg_get_plugins_path() . 'thewire/pages/thewire';
+
+ // if just /thewire go to global view in the else statement
+ if (isset($page[0]) && $page[0]) {
+
+ switch ($page[0]) {
+ case "all":
+ include "$base_dir/everyone.php";
+ break;
+
+ case "friends":
+ include "$base_dir/friends.php";
+ break;
+
+ case "owner":
+ include "$base_dir/owner.php";
+ break;
+
+ case "thread":
+ if (isset($page[1])) {
+ set_input('thread_id', $page[1]);
+ }
+ include "$base_dir/thread.php";
+ break;
+ case "reply":
+ if (isset($page[1])) {
+ set_input('guid', $page[1]);
+ }
+ include "$base_dir/reply.php";
+ break;
+ case "tag":
+ if (isset($page[1])) {
+ set_input('tag', $page[1]);
+ }
+ include "$base_dir/tag.php";
+ break;
+ case "previous":
+ if (isset($page[1])) {
+ set_input('guid', $page[1]);
+ }
+ include "$base_dir/previous.php";
+ break;
+ }
+ } else {
+ include "$base_dir/everyone.php";
+ }
+
+ return true;
+}
+
+/**
+ * Override the url for a wire post to return the thread
+ *
+ * @param ElggObject $thewirepost Wire post object
+ */
+function thewire_url($thewirepost) {
+ global $CONFIG;
+ return $CONFIG->url . "thewire/view/" . $thewirepost->guid;
+}
+
+/**
+ * Returns the notification body
+ *
+ * @return $string
+ */
+function thewire_notify_message($hook, $entity_type, $returnvalue, $params) {
+ global $CONFIG;
+
+ $entity = $params['entity'];
+ if (($entity instanceof ElggEntity) && ($entity->getSubtype() == 'thewire')) {
+ $descr = $entity->description;
+ $owner = $entity->getOwnerEntity();
+ if ($entity->reply) {
+ // have to do this because of poor design of Elgg notification system
+ $parent_post = get_entity(get_input('parent_guid'));
+ if ($parent_post) {
+ $parent_owner = $parent_post->getOwnerEntity();
+ }
+ $body = sprintf(elgg_echo('thewire:notify:reply'), $owner->name, $parent_owner->name);
+ } else {
+ $body = sprintf(elgg_echo('thewire:notify:post'), $owner->name);
+ }
+ $body .= "\n\n" . $descr . "\n\n";
+ $body .= elgg_echo('thewire') . ": {$CONFIG->url}thewire";
+ return $body;
+ }
+ return $returnvalue;
+}
+
+/**
+ * Get an array of hashtags from a text string
+ *
+ * @param string $text The text of a post
+ * @return array
+ */
+function thewire_get_hashtags($text) {
+ // beginning of text or white space followed by hashtag
+ // hashtag must begin with # and contain at least one character not digit, space, or punctuation
+ $matches = array();
+ preg_match_all('/(^|[^\w])#(\w*[^\s\d!-\/:-@]+\w*)/', $text, $matches);
+ return $matches[2];
+}
+
+/**
+ * Replace urls, hash tags, and @'s by links
+ *
+ * @param string $text The text of a post
+ * @return string
+ */
+function thewire_filter($text) {
+ global $CONFIG;
+
+ $text = ' ' . $text;
+
+ // email addresses
+ $text = preg_replace(
+ '/(^|[^\w])([\w\-\.]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})/i',
+ '$1<a href="mailto:$2@$3">$2@$3</a>',
+ $text);
+
+ // links
+ $text = parse_urls($text);
+
+ // usernames
+ $text = preg_replace(
+ '/(^|[^\w])@([\w]+)/',
+ '$1<a href="' . $CONFIG->wwwroot . 'thewire/owner/$2">@$2</a>',
+ $text);
+
+ // hashtags
+ $text = preg_replace(
+ '/(^|[^\w])#(\w*[^\s\d!-\/:-@]+\w*)/',
+ '$1<a href="' . $CONFIG->wwwroot . 'thewire/tag/$2">#$2</a>',
+ $text);
+
+ $text = trim($text);
+
+ return $text;
+}
+
+/**
+ * Create a new wire post.
+ *
+ * @param string $text The post text
+ * @param int $userid The user's guid
+ * @param int $access_id Public/private etc
+ * @param int $parent_guid Parent post guid (if any)
+ * @param string $method The method (default: 'site')
+ * @return guid or false if failure
+ */
+function thewire_save_post($text, $userid, $access_id, $parent_guid = 0, $method = "site") {
+ $post = new ElggObject();
+
+ $post->subtype = "thewire";
+ $post->owner_guid = $userid;
+ $post->access_id = $access_id;
+
+ // only 200 characters allowed
+ $text = elgg_substr($text, 0, 200);
+
+ // no html tags allowed so we escape
+ $post->description = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8');
+
+ $post->method = $method; //method: site, email, api, ...
+
+ $tags = thewire_get_hashtags($text);
+ if ($tags) {
+ $post->tags = $tags;
+ }
+
+ // must do this before saving so notifications pick up that this is a reply
+ if ($parent_guid) {
+ $post->reply = true;
+ }
+
+ $guid = $post->save();
+
+ // set thread guid
+ if ($parent_guid) {
+ $post->addRelationship($parent_guid, 'parent');
+
+ // name conversation threads by guid of first post (works even if first post deleted)
+ $parent_post = get_entity($parent_guid);
+ $post->wire_thread = $parent_post->wire_thread;
+ } else {
+ // first post in this thread
+ $post->wire_thread = $guid;
+ }
+
+ if ($guid) {
+ add_to_river('river/object/thewire/create', 'create', $post->owner_guid, $post->guid);
+ }
+
+ return $guid;
+}
+
+/**
+ * Send notification to poster of parent post if not notified already
+ *
+ * @param int $guid The guid of the reply wire post
+ * @param int $parent_guid The guid of the original wire post
+ * @param ElggUser $user The user who posted the reply
+ * @return void
+ */
+function thewire_send_response_notification($guid, $parent_guid, $user) {
+ $parent_owner = get_entity($parent_guid)->getOwnerEntity();
+ $user = get_loggedin_user();
+
+ // check to make sure user is not responding to self
+ if ($parent_owner->guid != $user->guid) {
+ // check if parent owner has notification for this user
+ $send_response = true;
+ global $NOTIFICATION_HANDLERS;
+ foreach ($NOTIFICATION_HANDLERS as $method => $foo) {
+ if (check_entity_relationship($parent_owner->guid, 'notify' . $method, $user->guid)) {
+ $send_response = false;
+ }
+ }
+
+ // create the notification message
+ if ($send_response) {
+ // grab same notification message that goes to everyone else
+ $params = array(
+ 'entity' => get_entity($guid),
+ 'method' => "email",
+ );
+ $msg = thewire_notify_message("", "", "", $params);
+
+ notify_user(
+ $parent_owner->guid,
+ $user->guid,
+ elgg_echo('thewire:notify:subject'),
+ $msg);
+ }
+ }
+}
+
+/**
+ * Get the latest wire guid - used for ajax update
+ *
+ * @return guid
+ */
+function thewire_latest_guid() {
+ $post = elgg_get_entities(array(
+ 'type' => 'object',
+ 'subtype' => 'thewire',
+ 'limit' => 1,
+ ));
+ if ($post) {
+ return $post[0]->guid;
+ } else {
+ return 0;
+ }
+}
+
+/**
+ * Get the parent of a wire post
+ *
+ * @param int $post_guid The guid of the reply
+ * @return ElggObject or null
+ */
+function thewire_get_parent($post_guid) {
+ $parents = elgg_get_entities_from_relationship(array(
+ 'relationship' => 'parent',
+ 'relationship_guid' => $post_guid,
+ ));
+ if ($parents) {
+ return $parents[0];
+ }
+ return null;
+}
+
+/**
+ * Sets up the entity menu for thewire
+ *
+ * Adds reply, thread, and view previous links. Removes edit and access.
+ *
+ * @param string $hook Hook name
+ * @param string $type Hook type
+ * @param array $value Array of menu items
+ * @param array $params Array with the entity
+ * @return array
+ */
+function thewire_setup_entity_menu_items($hook, $type, $value, $params) {
+ $handler = elgg_extract('handler', $params, false);
+ if ($handler != 'thewire') {
+ return $value;
+ }
+
+ foreach ($value as $index => $item) {
+ $name = $item->getName();
+ if ($name == 'access' || $name == 'edit') {
+ unset($value[$index]);
+ }
+ }
+
+ $entity = $params['entity'];
+
+ if (elgg_is_logged_in()) {
+ $options = array(
+ 'name' => 'reply',
+ 'text' => elgg_echo('thewire:reply'),
+ 'href' => "thewire/reply/$entity->guid",
+ 'priority' => 150,
+ );
+ $value[] = ElggMenuItem::factory($options);
+ }
+
+ if ($entity->reply) {
+ $options = array(
+ 'name' => 'previous',
+ 'text' => elgg_echo('thewire:previous'),
+ 'href' => "thewire/previous/$entity->guid",
+ 'priority' => 160,
+ );
+ $value[] = ElggMenuItem::factory($options);
+ }
+
+ $options = array(
+ 'name' => 'thread',
+ 'text' => elgg_echo('thewire:thread'),
+ 'href' => "thewire/thread/$entity->wire_thread",
+ 'priority' => 170,
+ );
+ $value[] = ElggMenuItem::factory($options);
+
+ return $value;
+}
+
+/**
+ * Add a menu item to an ownerblock
+ *
+ * @return array
+ */
+function thewire_owner_block_menu($hook, $type, $return, $params) {
+ if (elgg_instanceof($params['entity'], 'user')) {
+ $url = "thewire/owner/{$params['entity']->username}";
+ $item = new ElggMenuItem('thewire', elgg_echo('item:object:thewire'), $url);
+ $return[] = $item;
+ }
+
+ return $return;
+}
+
+/**
+ * Runs unit tests for the wire
+ *
+ * @return array
+ */
+function thewire_test($hook, $type, $value, $params) {
+ global $CONFIG;
+ $value[] = $CONFIG->pluginspath . 'thewire/tests/regex.php';
+ return $value;
+}