diff --git a/data/config.default.php b/data/config.default.php index 5e560a7..8af04ba 100644 --- a/data/config.default.php +++ b/data/config.default.php @@ -778,4 +778,10 @@ $unittestUrl = null; */ $allowUnittestMode = false; +/** + * bookmark-bot email address mapping + * Input address as key, user email as target + */ +$botMailMap = array(); + ?> diff --git a/scripts/bookmark-bot.php b/scripts/bookmark-bot.php new file mode 100755 index 0000000..126f39c --- /dev/null +++ b/scripts/bookmark-bot.php @@ -0,0 +1,125 @@ +#!/usr/bin/env php + + * @link https://github.com/cweiske/errbot-exec + */ +require_once dirname(__FILE__) . '/../src/SemanticScuttle/header-standalone.php'; + +if ($argc < 3) { + err('No message and user', 1); +} +$msg = $argv[1]; +$email = $argv[2]; + +if (preg_match('#(.+@.+)/.*#', $email, $matches)) { + //xmpp user name with resource: user@example.org/client + $email = $matches[1]; +} +if (isset($botMailMap[$email])) { + $email = $botMailMap[$email]; +} + +function err($msg, $code) +{ + echo $msg . "\n"; + exit($code); +} + +function getUserId($email) +{ + $users = SemanticScuttle_Service_Factory::get('User'); + if (!$users->isValidEmail($email)) { + err('Invalid e-mail address: ' . $email, 2); + } + $db = SemanticScuttle_Service_Factory::getDb(); + $res = $db->sql_query( + 'SELECT uId FROM '. $users->getTableName() + . ' WHERE email = "' . $db->sql_escape($email) . '"' + ); + $row = $db->sql_fetchrow($res); + if (!is_array($row)) { + err('User not found: ' . $email, 3); + } + return intval($row['uId']); +} + +function splitMsg($msg) +{ + $bmUrl = $msg; + $rest = ''; + if (strpos($msg, ' ') !== false) { + list($bmUrl, $rest) = explode(' ', $msg, 2); + } + $parts = parse_url($bmUrl); + if (!isset($parts['scheme'])) { + err('Scheme missing in URL', 2); + } + if (!SemanticScuttle_Model_Bookmark::isValidUrl($bmUrl)) { + err('Invalid bookmark URL', 2); + } + + $bmTags = array(); + $bmDesc = ''; + $rest = trim($rest); + if (strlen($rest) && $rest{0} == '#') { + //tags begin with '#' + preg_match_all('/#([a-zA-Z0-9]+)/', $rest, $matches); + $bmTags = $matches[1]; + foreach ($matches[0] as $tag) { + if (substr($rest, 0, strlen($tag)) == $tag) { + $rest = trim(substr($rest, strlen($tag))); + } + } + $bmDesc = $rest; + } else { + //use rest as tags + $bmTags = explode(' ', $rest); + $bmTags = array_map('trim', $bmTags); + } + + return array($bmUrl, $bmTags, $bmDesc); +} + +$userId = getUserId($email); +list($bmUrl, $bmTags, $bmDesc) = splitMsg($msg); + +$bookmarks = SemanticScuttle_Service_Factory::get('Bookmark'); +if ($bookmarks->bookmarkExists($bmUrl)) { + echo "URL already bookmarked.\n"; + exit(0); +} + +$urlhelper = new SemanticScuttle_UrlHelper(); +$bmTitle = $urlhelper->getTitle($bmUrl); + +$id = $bookmarks->addBookmark( + $bmUrl, + $bmTitle, + $bmDesc, + null, + SemanticScuttle_Model_Bookmark::SPUBLIC, + $bmTags, + null, + null, + true, + false, + $userId +); +if ($id === false) { + err('Error adding bookmark', 10); +} else { + echo "Bookmark created.\n"; + exit(0); +} +?> diff --git a/src/SemanticScuttle/header.php b/src/SemanticScuttle/header.php index 1f2f12c..562ae43 100644 --- a/src/SemanticScuttle/header.php +++ b/src/SemanticScuttle/header.php @@ -105,6 +105,7 @@ require_once 'SemanticScuttle/functions.php'; require_once 'SemanticScuttle/Model/Bookmark.php'; require_once 'SemanticScuttle/Model/UserArray.php'; require_once 'SemanticScuttle/Model/User/SslClientCert.php'; +require_once 'SemanticScuttle/UrlHelper.php'; if (count($GLOBALS['serviceoverrides']) > 0 && !defined('UNIT_TEST_MODE')