From: <wis...@us...> - 2015-12-01 13:25:03
|
Revision: 13171 http://sourceforge.net/p/xoops/svn/13171 Author: wishcraft Date: 2015-12-01 13:25:01 +0000 (Tue, 01 Dec 2015) Log Message: ----------- Pingtrax -- the Pinglist and Trackback Automated module -- Pre-alpha 1.01 -- Planning Modified Paths: -------------- XoopsModules/pingtrax/trunk/class/items.php XoopsModules/pingtrax/trunk/class/items_pings.php XoopsModules/pingtrax/trunk/class/items_sitemaps.php XoopsModules/pingtrax/trunk/class/pings.php XoopsModules/pingtrax/trunk/class/pings_sitemaps.php XoopsModules/pingtrax/trunk/class/plugins.php XoopsModules/pingtrax/trunk/class/sitemaps.php XoopsModules/pingtrax/trunk/sql/mysql.sql Added Paths: ----------- XoopsModules/pingtrax/trunk/include/category-id-names.txt XoopsModules/pingtrax/trunk/include/exclude-names.txt XoopsModules/pingtrax/trunk/include/item-id-names.txt XoopsModules/pingtrax/trunk/preloads/items.php Modified: XoopsModules/pingtrax/trunk/class/items.php =================================================================== --- XoopsModules/pingtrax/trunk/class/items.php 2015-12-01 11:48:27 UTC (rev 13170) +++ XoopsModules/pingtrax/trunk/class/items.php 2015-12-01 13:25:01 UTC (rev 13171) @@ -1,6 +1,6 @@ <?php /** - * Pintrax Database Class Handler module + * Pingtrax Database Class Handler module * * You may not change or alter any portion of this comment or credits * of supporting developers from this source code or any supporting source code @@ -22,7 +22,7 @@ /** - * Class PintraxItems + * Class PingtraxItems * * @subpackage pingtrax * @@ -97,9 +97,9 @@ } /** - * Class PintraxItemsHandler + * Class PingtraxItemsHandler */ -class PintraxItemsHandler extends XoopsPersistableObjectHandler +class PingtraxItemsHandler extends XoopsPersistableObjectHandler { /** @@ -110,5 +110,37 @@ parent::__construct($db, "pingtrax_items", 'PingtraxItems', 'id', 'referer'); } + + function insert($object = NULL, $force = true) + { + if ($object->isNew()) + { + $object->setVar('created', time()); + } else { + $object->setVar('updated', time()); + } + switch ($object->getVar('user-session')) + { + default: + case 'unknown': + if (is_object($GLOBALS['xoopsUser'])) + { + if ($GLOBALS['xoopsUser']->isAdmin()) + $object->setVar('user-session', 'admin'); + } + case 'admin': + if (is_object($GLOBALS['xoopsUser'])) + { + if (!$GLOBALS['xoopsUser']->isAdmin()) + $object->setVar('user-session', 'user'); + } + case 'user': + if (!is_object($GLOBALS['xoopsUser'])) + $object->setVar('user-session', 'guest'); + case 'guest': + break; + } + return parent::insert($object, $force); + } } Modified: XoopsModules/pingtrax/trunk/class/items_pings.php =================================================================== --- XoopsModules/pingtrax/trunk/class/items_pings.php 2015-12-01 11:48:27 UTC (rev 13170) +++ XoopsModules/pingtrax/trunk/class/items_pings.php 2015-12-01 13:25:01 UTC (rev 13171) @@ -1,6 +1,6 @@ <?php /** - * Pintrax Database Class Handler module + * Pingtrax Database Class Handler module * * You may not change or alter any portion of this comment or credits * of supporting developers from this source code or any supporting source code @@ -22,7 +22,7 @@ /** - * Class PintraxItems_pings + * Class PingtraxItems_pings * * @subpackage itemtrax * @@ -56,9 +56,9 @@ } /** - * Class PintraxItems_pingsHandler + * Class PingtraxItems_pingsHandler */ -class PintraxItems_pingsHandler extends XoopsPersistableObjectHandler +class PingtraxItems_pingsHandler extends XoopsPersistableObjectHandler { /** Modified: XoopsModules/pingtrax/trunk/class/items_sitemaps.php =================================================================== --- XoopsModules/pingtrax/trunk/class/items_sitemaps.php 2015-12-01 11:48:27 UTC (rev 13170) +++ XoopsModules/pingtrax/trunk/class/items_sitemaps.php 2015-12-01 13:25:01 UTC (rev 13171) @@ -1,6 +1,6 @@ <?php /** - * Pintrax Database Class Handler module + * Pingtrax Database Class Handler module * * You may not change or alter any portion of this comment or credits * of supporting developers from this source code or any supporting source code @@ -22,7 +22,7 @@ /** - * Class PintraxItems_sitemaps + * Class PingtraxItems_sitemaps * * @subpackage itemtrax * @@ -56,9 +56,9 @@ } /** - * Class PintraxItems_sitemapsHandler + * Class PingtraxItems_sitemapsHandler */ -class PintraxItems_sitemapsHandler extends XoopsPersistableObjectHandler +class PingtraxItems_sitemapsHandler extends XoopsPersistableObjectHandler { /** Modified: XoopsModules/pingtrax/trunk/class/pings.php =================================================================== --- XoopsModules/pingtrax/trunk/class/pings.php 2015-12-01 11:48:27 UTC (rev 13170) +++ XoopsModules/pingtrax/trunk/class/pings.php 2015-12-01 13:25:01 UTC (rev 13171) @@ -1,6 +1,6 @@ <?php /** - * Pintrax Database Class Handler module + * Pingtrax Database Class Handler module * * You may not change or alter any portion of this comment or credits * of supporting developers from this source code or any supporting source code @@ -22,7 +22,7 @@ /** - * Class PintraxPings + * Class PingtraxPings * * @subpackage pingtrax * @@ -66,7 +66,6 @@ $this->initVar('sleep-till', XOBJ_DTYPE_INT, 0, false); $this->initVar('success-time', XOBJ_DTYPE_INT, 0, false); $this->initVar('failure-time', XOBJ_DTYPE_INT, 0, false); - $this->initVar('written', XOBJ_DTYPE_INT, 0, false); $this->initVar('created', XOBJ_DTYPE_INT, 0, false); $this->initVar('updated', XOBJ_DTYPE_INT, 0, false); $this->initVar('offline', XOBJ_DTYPE_INT, 0, false); @@ -75,18 +74,48 @@ } /** - * Class PintraxPingsHandler + * Class PingtraxPingsHandler */ -class PintraxPingsHandler extends XoopsPersistableObjectHandler +class PingtraxPingsHandler extends XoopsPersistableObjectHandler { + /** + * var string URL of JSON Resource for Install + */ + var $_resource = "https://sourceforge.net/p/xoops/svn/HEAD/tree/XoopsModules/pingtrax/data/ping-resources.json?format=raw"; + /** * @param null|object $db */ function __construct(&$db) { parent::__construct($db, "pingtrax_pings", 'PingtraxPings', 'id', 'referer'); + + $criteria = new Criteria('id',0,"<>"); + if ($this->getCount($criteria)==0) + { + $data = json_decode(file_get_contents($this->_resource), true); + foreach($data as $referer => $values) + { + $obj = $this->create(true); + $obj->setVar('referer', $referer); + $obj->setVar('type', $values['type']); + $obj->setVar('uri', $values['uri']); + $this->insert($obj); + } + } } + + function insert($object = NULL, $force = true) + { + if ($object->isNew()) + { + $object->setVar('created', time()); + } else { + $object->setVar('updated', time()); + } + return parent::insert($object, $force); + } } Modified: XoopsModules/pingtrax/trunk/class/pings_sitemaps.php =================================================================== --- XoopsModules/pingtrax/trunk/class/pings_sitemaps.php 2015-12-01 11:48:27 UTC (rev 13170) +++ XoopsModules/pingtrax/trunk/class/pings_sitemaps.php 2015-12-01 13:25:01 UTC (rev 13171) @@ -1,6 +1,6 @@ <?php /** - * Pintrax Database Class Handler module + * Pingtrax Database Class Handler module * * You may not change or alter any portion of this comment or credits * of supporting developers from this source code or any supporting source code @@ -22,7 +22,7 @@ /** - * Class PintraxPings_sitemaps + * Class PingtraxPings_sitemaps * * @subpackage pingtrax * @@ -56,9 +56,9 @@ } /** - * Class PintraxPings_sitemapsHandler + * Class PingtraxPings_sitemapsHandler */ -class PintraxPings_sitemapsHandler extends XoopsPersistableObjectHandler +class PingtraxPings_sitemapsHandler extends XoopsPersistableObjectHandler { /** Modified: XoopsModules/pingtrax/trunk/class/plugins.php =================================================================== --- XoopsModules/pingtrax/trunk/class/plugins.php 2015-12-01 11:48:27 UTC (rev 13170) +++ XoopsModules/pingtrax/trunk/class/plugins.php 2015-12-01 13:25:01 UTC (rev 13171) @@ -23,29 +23,235 @@ defined('XOOPS_ROOT_PATH') || die('XOOPS root path not defined'); /** - * Class PingtraxPluginsDefault + * Class PingtraxPlugins */ -class PingtraxPlugins +class PingtraxPlugins extends XoopsObject { - /** - * @param $args - - function eventCoreIncludeFunctionsRedirectheader($args) - { - $context = stream_context_create(array('http' => array( - 'method' => "POST", - 'header' => "Content-Type: text/xml\r\n", - 'content' => $xml - ))); - $file = @file_get_contents($post_to, false, $context); - if ($file === false) { echo '<p>Couldn\'t connect!</p>'; } - elseif ($file) { - echo '<p>The following response was returned:</p>'; - echo '<pre>'.htmlspecialchars($file).'</pre>'; - } else { - echo '<p>Empty response!</p>'; - } - } - */ - + + /** + * + */ + function __construct() + { + $this->XoopsObject(); + } + + /** + * + */ + function getModuleDirname() + { + if (is_a($GLOBALS['xoopsModule'], 'XoopsModule')) + { + return $GLOBALS['xoopsModule']->getVar('dirname'); + } + } + + /** + * + */ + function getModuleClass() + { + switch ($this->getModulePHPSelf()) + { + default: + + foreach(get_declared_classes() as $class) + { + if (substr(strtolower($class), 0, strlen($this->getModuleDirname()))==strtolower($this->getModuleDirname()) && (!strpos(strtolower($class), 'categor') && !strpos(strtolower($this->getModulePHPSelf()), 'categor'))) + { + if (is_a(new $class(), "XoopsPersistableObjectHandler")) + return $class; + } + } + + break; + } + } + + /** + * + */ + function getModuleItemID() + { + $id = 0; + switch ($this->getModulePHPSelf()) + { + default: + + $idnaming = explode(array("\n", "\n\r", "\r\n"), file_get_contents(dirname(__DIR__) . DIRECTORY_SEPARATOR . 'include' . DIRECTORY_SEPARATOR . 'item-id-names.txt')); + foreach($_GET as $key => $value) + { + if (!is_array($value)) + { + foreach($idnaming as $idname) + { + if (strpos($key, $idname) && is_numeric($_GET[$key])) + $id = $_GET[$key]; + elseif (is_numeric($_GET[$key]) && !in_array($key, explode(array("\n", "\n\r", "\r\n"), file_get_contents(dirname(__DIR__) . DIRECTORY_SEPARATOR . 'include' . DIRECTORY_SEPARATOR . 'exclude-names.txt')))) + $id = $_GET[$key]; + } + } + } + } + return $id; + } + + /** + * + */ + function getModulePHPSelf() + { + $parts = explode(DIRECTORY_SEPARATOR, $this->getItemPHPSelf()); + $found = false; + foreach($parts as $id => $value) + { + if ($found == false) + unset($parts[$id]); + if ($value == 'modules') + $found = true; + } + return implode(DIRECTORY_SEPARATOR, $parts); + } + + /** + * + */ + function getModuleGet() + { + return $_GET; + } + + + /** + * + */ + function getItemCategoryID() + { + $id = 0; + switch ($this->getModulePHPSelf()) + { + default: + + $idnaming = explode(array("\n", "\n\r", "\r\n"), file_get_contents(dirname(__DIR__) . DIRECTORY_SEPARATOR . 'include' . DIRECTORY_SEPARATOR . 'category-id-names.txt')); + foreach($_GET as $key => $value) + { + if (!is_array($value)) + { + foreach($idnaming as $idname) + { + if (strpos($key, $idname) && is_numeric($_GET[$key])) + $id = $_GET[$key]; + elseif ($id = 0 && is_numeric($_GET[$key]) && !in_array($key, explode(array("\n", "\n\r", "\r\n"), file_get_contents(dirname(__DIR__) . DIRECTORY_SEPARATOR . 'include' . DIRECTORY_SEPARATOR . 'exclude-names.txt')))) + $id = $_GET[$key]; + } + } + } + } + return $id; + } + + /** + * + */ + function getItemProtocol() + { + return strtolower(XOOPS_PROT); + } + + /** + * + */ + function getItemDomain() + { + return parse_url(strtolower(XOOPS_URL), PHP_URL_HOST); + } + + /** + * + */ + function getItemRefererURI() + { + if (parse_url(strtolower(XOOPS_URL), PHP_URL_PATH) == substr(strtolower($_SERVER["REQUEST_URI"]), 0, strlen(parse_url(strtolower(XOOPS_URL), PHP_URL_PATH)))) + return substr($_SERVER["REQUEST_URI"], strlen(parse_url(strtolower(XOOPS_URL), PHP_URL_PATH))-1); + return $_SERVER["REQUEST_URI"]; + } + + /** + * + */ + function getItemPHPSelf() + { + if (XOOPS_ROOT_PATH == substr(strtolower($_SERVER["REQUEST_URI"]), 0, strlen(XOOPS_ROOT_PATH))) + return substr($_SERVER["PHP_SELF"], strlen(XOOPS_ROOT_PATH)-1); + return $_SERVER["PHP_SELF"]; + } } + + +/** + * Class PingtraxPluginsHandler + */ +class PingtraxPluginsHandler extends XoopsPersistableObjectHandler +{ + + /** + * @var string + */ + var $_default = 'default'; + + /** + * @var array + */ + var $_plugins = array(); + + /** + * @param null|object $db + */ + function __construct(&$db) + { + parent::__construct($db); + } + + function getIntialItemArray() + { + $ret = array(); + if (is_a($GLOBALS['xoopsModule'], 'XoopsModule')) + { + if (file_exists($file = dirname(__DIR__) . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR . ($dirname = $GLOBALS['xoopsModule']->getVar('dirname')) . '.php')) + { + require_once $file; + } elseif (file_exists($file = dirname(__DIR__) . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR . ($dirname = $this->_default) . '.php')) + { + require_once $file; + } + } elseif (file_exists($file = dirname(__DIR__) . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR . ($dirname = $this->_default) . '.php')) + { + require_once $file; + } + if (class_exists($class = "PingtraxPlugins".ucfirst(strtolower($dirname))) && empty($this->_plugins[$dirname])) + { + $this->_plugins[$dirname] = new $class(); + } + if (is_object($this->_plugins[$dirname])) + { + $ret['module-dirname'] = $this->_plugins[$dirname]->getModuleDirname(); + $ret['module-class'] = $this->_plugins[$dirname]->getModuleClass(); + $ret['module-item-id'] = $this->_plugins[$dirname]->getModuleItemID(); + $ret['module-php-self'] = $this->_plugins[$dirname]->getModulePHPSelf(); + $ret['module-get'] = $this->_plugins[$dirname]->getModuleGet(); + $ret['item-category-id'] = $this->_plugins[$dirname]->getItemCategoryID(); + $ret['item-protocol'] = $this->_plugins[$dirname]->getItemProtocol(); + $ret['item-domain'] = $this->_plugins[$dirname]->getItemDomain(); + $ret['item-referer-uri'] = $this->_plugins[$dirname]->getItemRefererURI(); + $ret['item-php-self'] = $this->_plugins[$dirname]->getItemPHPSelf(); + $ret['referer'] = $this->getReferer($ret); + } + return $ret; + } + + function getReferer($ret = array()) + { + return sha1($ret['item-php-self'] . $ret['item-referer-uri'] . $ret['module-dirname'] . $ret['module-class'] . $ret['item-category-id'] . $ret['module-item-id'] . $ret['module-php-self'] . json_encode($ret['module-get'], true) . $ret['item-protocol'] . $ret['item-domain']); + } +} Modified: XoopsModules/pingtrax/trunk/class/sitemaps.php =================================================================== --- XoopsModules/pingtrax/trunk/class/sitemaps.php 2015-12-01 11:48:27 UTC (rev 13170) +++ XoopsModules/pingtrax/trunk/class/sitemaps.php 2015-12-01 13:25:01 UTC (rev 13171) @@ -1,6 +1,6 @@ <?php /** - * Pintrax Database Class Handler module + * Pingtrax Database Class Handler module * * You may not change or alter any portion of this comment or credits * of supporting developers from this source code or any supporting source code @@ -22,7 +22,7 @@ /** - * Class PintraxSitemaps + * Class PingtraxSitemaps * * Database MySQL Table:- * @@ -81,9 +81,9 @@ } /** - * Class PintraxSitemapsHandler + * Class PingtraxSitemapsHandler */ -class PintraxSitemapsHandler extends XoopsPersistableObjectHandler +class PingtraxSitemapsHandler extends XoopsPersistableObjectHandler { /** @@ -94,5 +94,16 @@ parent::__construct($db, "pingtrax_sitemaps", 'PingtraxSitemaps', 'id', 'referer'); } + + function insert($object = NULL, $force = true) + { + if ($object->isNew()) + { + $object->setVar('created', time()); + } else { + $object->setVar('updated', time()); + } + return parent::insert($object, $force); + } } Added: XoopsModules/pingtrax/trunk/include/category-id-names.txt =================================================================== --- XoopsModules/pingtrax/trunk/include/category-id-names.txt (rev 0) +++ XoopsModules/pingtrax/trunk/include/category-id-names.txt 2015-12-01 13:25:01 UTC (rev 13171) @@ -0,0 +1,3 @@ +id +cat +category \ No newline at end of file Added: XoopsModules/pingtrax/trunk/include/exclude-names.txt =================================================================== --- XoopsModules/pingtrax/trunk/include/exclude-names.txt (rev 0) +++ XoopsModules/pingtrax/trunk/include/exclude-names.txt 2015-12-01 13:25:01 UTC (rev 13171) @@ -0,0 +1,3 @@ +start +num +weight \ No newline at end of file Added: XoopsModules/pingtrax/trunk/include/item-id-names.txt =================================================================== --- XoopsModules/pingtrax/trunk/include/item-id-names.txt (rev 0) +++ XoopsModules/pingtrax/trunk/include/item-id-names.txt 2015-12-01 13:25:01 UTC (rev 13171) @@ -0,0 +1,2 @@ +id +item \ No newline at end of file Added: XoopsModules/pingtrax/trunk/preloads/items.php =================================================================== --- XoopsModules/pingtrax/trunk/preloads/items.php (rev 0) +++ XoopsModules/pingtrax/trunk/preloads/items.php 2015-12-01 13:25:01 UTC (rev 13171) @@ -0,0 +1,41 @@ +<?php +/** + * PingTrax Preloads + * + * You may not change or alter any portion of this comment or credits + * of supporting developers from this source code or any supporting source code + * which is considered copyrighted (c) material of the original comment or credit authors. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * @copyright Chronolabs Cooperative http://sourceforge.net/projects/chronolabs/ + * @license GNU GPL 3 (http://labs.coop/briefs/legal/general-public-licence/13,3.html) + * @author Simon Antony Roberts <wis...@us...> + * @see http://sourceforge.net/projects/xoops/ + * @see http://sourceforge.net/projects/chronolabs/ + * @see http://sourceforge.net/projects/chronolabsapi/ + * @see http://labs.coop + * @version 1.0.1 + * @since 1.0.1 + */ + +defined('XOOPS_ROOT_PATH') || die('XOOPS root path not defined'); + +/** + * Class PingtraxPingPreload + */ +class PingtraxItemsPreload extends XoopsPreloadItem +{ + + /** + * @param $args + */ + function eventCoreIncludeCommonEnd($args) + { + global $moduleitem; + $pluginHandler = xoops_getmodulehandler('plugins', 'pingtrax'); + $moduleitem = $pluginHandler->getIntialItemArray(); + } + +} Modified: XoopsModules/pingtrax/trunk/sql/mysql.sql =================================================================== --- XoopsModules/pingtrax/trunk/sql/mysql.sql 2015-12-01 11:48:27 UTC (rev 13170) +++ XoopsModules/pingtrax/trunk/sql/mysql.sql 2015-12-01 13:25:01 UTC (rev 13171) @@ -1,6 +1,4 @@ -DROP TABLE IF EXISTS `pingtrax_items`; - CREATE TABLE `pingtrax_items` ( `id` mediumint(20) NOT NULL AUTO_INCREMENT, `referer` varchar(44) NOT NULL DEFAULT '', @@ -34,8 +32,6 @@ ) ENGINE=InnoDB DEFAULT CHARSET=utf8 PACK_KEYS=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC KEY_BLOCK_SIZE=16; -DROP TABLE IF EXISTS `pingtrax_items_pings`; - CREATE TABLE `pingtrax_items_pings` ( `id` mediumint(32) NOT NULL AUTO_INCREMENT, `ping-referer` varchar(44) NOT NULL DEFAULT '', @@ -46,8 +42,6 @@ KEY `CHRONOLOGISTICS` (`ping-referer`,`item-referer`,`when`) USING BTREE KEY_BLOCK_SIZE=64 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 PACK_KEYS=1 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC KEY_BLOCK_SIZE=8; -DROP TABLE IF EXISTS `pingtrax_items_sitemaps`; - CREATE TABLE `pingtrax_items_sitemaps` ( `id` mediumint(32) NOT NULL AUTO_INCREMENT, `map-referer` varchar(44) NOT NULL DEFAULT '', @@ -58,8 +52,6 @@ KEY `CHRONOLOGISTICS` (`map-referer`,`item-referer`,`when`) USING BTREE KEY_BLOCK_SIZE=64 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 PACK_KEYS=1 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC KEY_BLOCK_SIZE=8; -DROP TABLE IF EXISTS `pingtrax_pings`; - CREATE TABLE `pingtrax_pings` ( `id` int(14) NOT NULL AUTO_INCREMENT, `referer` varchar(44) NOT NULL DEFAULT '', @@ -79,8 +71,6 @@ KEY `CHRONOLOGISTICS` (`id`,`referer`,`created`,`updated`,`offlined`,`failure-time`,`success-time`,`sleep-till`) USING BTREE KEY_BLOCK_SIZE=128 ) ENGINE=InnoDB AUTO_INCREMENT=150 DEFAULT CHARSET=utf8 PACK_KEYS=1 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC KEY_BLOCK_SIZE=16; -DROP TABLE IF EXISTS `pingtrax_pings_sitemaps`; - CREATE TABLE `pingtrax_pings_sitemaps` ( `id` mediumint(32) NOT NULL AUTO_INCREMENT, `map-referer` varchar(44) NOT NULL DEFAULT '', @@ -91,8 +81,6 @@ KEY `CHRONOLOGISTICS` (`map-referer`,`ping-referer`,`when`) USING BTREE KEY_BLOCK_SIZE=64 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 PACK_KEYS=1 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC KEY_BLOCK_SIZE=8; -DROP TABLE IF EXISTS `pingtrax_sitemaps`; - CREATE TABLE `pingtrax_sitemaps` ( `id` int(10) NOT NULL AUTO_INCREMENT, `referer` varchar(44) NOT NULL DEFAULT '', |
From: <wis...@us...> - 2015-12-01 14:58:35
|
Revision: 13173 http://sourceforge.net/p/xoops/svn/13173 Author: wishcraft Date: 2015-12-01 14:58:33 +0000 (Tue, 01 Dec 2015) Log Message: ----------- Pingtrax -- the Pinglist and Trackback Automated module -- Pre-alpha 1.01 -- Planning Modified Paths: -------------- XoopsModules/pingtrax/trunk/class/items.php XoopsModules/pingtrax/trunk/class/plugins.php XoopsModules/pingtrax/trunk/plugins/default.php XoopsModules/pingtrax/trunk/preloads/items.php Modified: XoopsModules/pingtrax/trunk/class/items.php =================================================================== --- XoopsModules/pingtrax/trunk/class/items.php 2015-12-01 13:44:06 UTC (rev 13172) +++ XoopsModules/pingtrax/trunk/class/items.php 2015-12-01 14:58:33 UTC (rev 13173) @@ -76,9 +76,9 @@ $this->initVar('module-php-self', XOBJ_DTYPE_OTHER, '', false, 150); $this->initVar('module-get', XOBJ_DTYPE_ARRAY, array(), false); $this->initVar('item-author-uid', XOBJ_DTYPE_INT, 0, false); - $this->initVar('item-author-name', XOBJ_DTYPE_TXTBOX, 0, false, 64); - $this->initVar('item-title', XOBJ_DTYPE_TXTBOX, 0, false, 180); - $this->initVar('item-description', XOBJ_DTYPE_TXTBOX, 0, false, 250); + $this->initVar('item-author-name', XOBJ_DTYPE_TXTBOX, '', false, 64); + $this->initVar('item-title', XOBJ_DTYPE_TXTBOX, '', false, 180); + $this->initVar('item-description', XOBJ_DTYPE_TXTBOX, '', false, 250); $this->initVar('item-protocol', XOBJ_DTYPE_ENUM, XOOPS_PROT, true, false, false, false, array('https://','http://')); $this->initVar('item-domain', XOBJ_DTYPE_TXTBOX, parse_url(XOOPS_URL, PHP_URL_HOST), true, 150); $this->initVar('item-referer-uri', XOBJ_DTYPE_TXTBOX, $_SERVER["REQUEST_URI"], true, 250); @@ -88,7 +88,6 @@ $this->initVar('feed-referer-uri', XOBJ_DTYPE_TXTBOX, parse_url(XOOPS_URL, PHP_URL_PATH) . '/backend.php', true, 250); $this->initVar('discovery-hook', XOBJ_DTYPE_ENUM, 'unknown', true, false, false, false, array('php','preloader','smarty','combination','unknown')); $this->initVar('user-session', XOBJ_DTYPE_ENUM, 'unknown', true, false, false, false, array('admin','user','guest','unknown')); - $this->initVar('written', XOBJ_DTYPE_INT, 0, false); $this->initVar('created', XOBJ_DTYPE_INT, 0, false); $this->initVar('updated', XOBJ_DTYPE_INT, 0, false); $this->initVar('offline', XOBJ_DTYPE_INT, 0, false); @@ -115,7 +114,17 @@ { if ($object->isNew()) { - $object->setVar('created', time()); + $criteria = new Criteria('referer', $object->getVar('referer')); + if ($this->getCount($criteria)==0) + $object->setVar('created', time()); + else + { + $objs = $this->getObjects($criteria, false); + if (isset($objs[0])) + return $objs[0]->getVar('id'); + else + return false; + } } else { $object->setVar('updated', time()); } Modified: XoopsModules/pingtrax/trunk/class/plugins.php =================================================================== --- XoopsModules/pingtrax/trunk/class/plugins.php 2015-12-01 13:44:06 UTC (rev 13172) +++ XoopsModules/pingtrax/trunk/class/plugins.php 2015-12-01 14:58:33 UTC (rev 13173) @@ -29,11 +29,25 @@ { /** + * @var array + */ + var $_configs = array(); + + /** * */ function __construct() { $this->XoopsObject(); + + // Load Module Config's into object array + $moduleHandler = xoops_gethandler('module'); + $module = $moduleHandler->getByDirname('pingtrax'); + if (is_a($module, 'XoopsModule')) + { + $configHandler = xoops_gethandler('config'); + $this->_configs = $configHandler->getConfigList($module->getVar('mid')); + } } /** @@ -60,8 +74,8 @@ { if (substr(strtolower($class), 0, strlen($this->getModuleDirname()))==strtolower($this->getModuleDirname()) && (!strpos(strtolower($class), 'categor') && !strpos(strtolower($this->getModulePHPSelf()), 'categor'))) { - if (is_a(new $class(), "XoopsPersistableObjectHandler")) - return $class; + if (is_a(@new $class(), "XoopsPersistableObjectHandler")) + return strtolower(str_replace(array(ucfirst($this->getModuleDirname()), $this->getModuleDirname(), 'handler', 'Handler'), '', $class)); } } @@ -186,6 +200,165 @@ return substr($_SERVER["PHP_SELF"], strlen(XOOPS_ROOT_PATH)-1); return $_SERVER["PHP_SELF"]; } + + + /** + * + */ + function getItemTitle() + { + switch ($this->getModulePHPSelf()) + { + default: + + if (is_object($GLOBALS['xoopsTpl'])) + return $GLOBALS['xoopsTpl']->_tpl_vars['xoops_pagetitle']; + break; + } + return $GLOBALS["xoopsConfig"]['sitename']; + } + + + /** + * + */ + function getItemDescription() + { + switch ($this->getModulePHPSelf()) + { + default: + + if (is_object($GLOBALS['xoopsTpl'])) + return $GLOBALS['xoopsTpl']->_tpl_vars['xoops_meta_description']; + break; + } + return $GLOBALS["xoopsConfigMetaFooter"]['meta_description']; + } + + /** + * + */ + function getItemAuthorUID() + { + static $uid = 0; + if ($uid = 0) + switch ($this->getModulePHPSelf()) + { + default: + foreach($GLOBALS['xoopsTpl']->_tpl_vars as $key => $values) + { + if ($key = 'uid' && is_numeric($values)) + $uid = $values; + elseif(is_array($values)) + $uid = explore_array($values, 'uid', 'uid=([0-9]+)'); + elseif(is_string($values)) + { + preg_match('uid=([0-9])+', $values, $matches); + if (!empty($matches)) + { + foreach($matches as $match) + { + if (is_array($match)) + { + foreach($match as $value) + if (is_numeric($value)) + { + $uid = $value; + continue; + continue; + continue; + continue; + } + } else { + $uid = $match; + continue; + continue; + continue; + } + } + } + } + if ($uid>0) + continue; + } + } + return $uid; + } + + function explore_array($array = array(), $key = 'uid', $pattern = 'uid=([0-9]+)') + { + foreach($array as $key => $values) + { + if ($key = 'uid' && is_numeric($values)) + return $values; + elseif(is_array($values)) + return explore_array($values, 'uid', 'uid=([0-9]+)'); + elseif(is_string($values)) + { + preg_match('uid=([0-9])+', $values, $matches); + if (!empty($matches)) + foreach($matches as $match) + if (is_array($match)) + foreach($match as $value) + if (is_numeric($value)) + { + return $value; + } + else + return $match; + } + } + } + + /** + * + */ + function getItemAuthorName() + { + switch ($this->getModulePHPSelf()) + { + default: + if ($this->getItemAuthorUID()>0) + { + $userHandler = xoops_gethandler('user'); + $user = $userHandler->get($this->getItemAuthorUID()); + if (is_a($user, "XoopsUser")) + { + if (trim($user->getVar('name'))!='') + return trim($user->getVar('name')); + else + return trim($user->getVar('uname')); + } + } + } + return $GLOBALS["xoopsConfig"]['sitename']; + } + + + /** + * + */ + function getFeedProtocol() + { + return parse_url(strtolower($this->_configs['default_feed_url']), PHP_URL_SCHEME); + } + + /** + * + */ + function getFeedDomain() + { + return parse_url(strtolower($this->_configs['default_feed_url']), PHP_URL_HOST); + } + + /** + * + */ + function getFeedRefererURI() + { + return parse_url(strtolower($this->_configs['default_feed_url']), PHP_URL_PATH) . "?" .parse_url(strtolower($this->_configs['default_feed_url']), PHP_URL_QUERY); + } + } @@ -213,7 +386,7 @@ parent::__construct($db); } - function getIntialItemArray() + function getItemObject() { $ret = array(); if (is_a($GLOBALS['xoopsModule'], 'XoopsModule')) @@ -244,14 +417,55 @@ $ret['item-protocol'] = $this->_plugins[$dirname]->getItemProtocol(); $ret['item-domain'] = $this->_plugins[$dirname]->getItemDomain(); $ret['item-referer-uri'] = $this->_plugins[$dirname]->getItemRefererURI(); + $ret['feed-protocol'] = $this->_plugins[$dirname]->getFeedProtocol(); + $ret['feed-domain'] = $this->_plugins[$dirname]->getFeedDomain(); + $ret['feed-referer-uri'] = $this->_plugins[$dirname]->getFeedRefererURI(); $ret['item-php-self'] = $this->_plugins[$dirname]->getItemPHPSelf(); $ret['referer'] = $this->getReferer($ret); } + if (!empty($ret)) + { + $itemsHandler = xoops_getmodulehandler('items', 'pingtrax'); + $item = $itemHandler->create(true); + $item->setVars($ret); + $ret = $itemHandler->get($itemHandler->insert($item)); + } return $ret; } function getReferer($ret = array()) { - return sha1($ret['item-php-self'] . $ret['item-referer-uri'] . $ret['module-dirname'] . $ret['module-class'] . $ret['item-category-id'] . $ret['module-item-id'] . $ret['module-php-self'] . json_encode($ret['module-get'], true) . $ret['item-protocol'] . $ret['item-domain']); + return sha1($ret['item-php-self'] . $ret['item-referer-uri'] . $ret['feed-protocol'] . $ret['feed-domain'] . $ret['feed-referer-uri'] . $ret['module-dirname'] . $ret['module-class'] . $ret['item-category-id'] . $ret['module-item-id'] . $ret['module-php-self'] . json_encode($ret['module-get'], true) . $ret['item-protocol'] . $ret['item-domain']); } + + function setFooterItem(PingtraxItems $item) + { + if (is_a($GLOBALS['xoopsModule'], 'XoopsModule')) + { + if (file_exists($file = dirname(__DIR__) . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR . ($dirname = $GLOBALS['xoopsModule']->getVar('dirname')) . '.php')) + { + require_once $file; + } elseif (file_exists($file = dirname(__DIR__) . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR . ($dirname = $this->_default) . '.php')) + { + require_once $file; + } + } elseif (file_exists($file = dirname(__DIR__) . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR . ($dirname = $this->_default) . '.php')) + { + require_once $file; + } + if (class_exists($class = "PingtraxPlugins".ucfirst(strtolower($dirname))) && empty($this->_plugins[$dirname])) + { + $this->_plugins[$dirname] = new $class(); + } + if (is_object($this->_plugins[$dirname])) + { + $item->setVar('item-author-uid', $this->_plugins[$dirname]->getItemAuthorUID()); + $item->setVar('item-author-name', $this->_plugins[$dirname]->getItemAuthorName()); + $item->setVar('item-title', $this->_plugins[$dirname]->getItemTitle()); + $item->setVar('item-description', $this->_plugins[$dirname]->getItemTitle()); + $itemsHandler = xoops_getmodulehandler('items', 'pingtrax'); + return $itemHandler->get($itemHandler->insert($item)); + } + return $item; + } } Modified: XoopsModules/pingtrax/trunk/plugins/default.php =================================================================== --- XoopsModules/pingtrax/trunk/plugins/default.php 2015-12-01 13:44:06 UTC (rev 13172) +++ XoopsModules/pingtrax/trunk/plugins/default.php 2015-12-01 14:58:33 UTC (rev 13173) @@ -27,25 +27,6 @@ */ class PingtraxPluginsDefault extends PingtraxPlugins { - /** - * @param $args - - function eventCoreIncludeFunctionsRedirectheader($args) - { - $context = stream_context_create(array('http' => array( - 'method' => "POST", - 'header' => "Content-Type: text/xml\r\n", - 'content' => $xml - ))); - $file = @file_get_contents($post_to, false, $context); - if ($file === false) { echo '<p>Couldn\'t connect!</p>'; } - elseif ($file) { - echo '<p>The following response was returned:</p>'; - echo '<pre>'.htmlspecialchars($file).'</pre>'; - } else { - echo '<p>Empty response!</p>'; - } - } - */ + } Modified: XoopsModules/pingtrax/trunk/preloads/items.php =================================================================== --- XoopsModules/pingtrax/trunk/preloads/items.php 2015-12-01 13:44:06 UTC (rev 13172) +++ XoopsModules/pingtrax/trunk/preloads/items.php 2015-12-01 14:58:33 UTC (rev 13173) @@ -33,9 +33,23 @@ */ function eventCoreIncludeCommonEnd($args) { - global $moduleitem; + global $pingtraxitem; $pluginHandler = xoops_getmodulehandler('plugins', 'pingtrax'); - $moduleitem = $pluginHandler->getIntialItemArray(); + $pingtraxitem = $pluginHandler->getItemObject(); } - + + /** + * @param $args + */ + function eventCoreFooterEnd($args) + { + global $pingtraxitem; + if (is_a($pingtraxitem, "PingtraxItems")) + { + $pluginHandler = xoops_getmodulehandler('plugins', 'pingtrax'); + if ($pingtraxitem->getVar('discover-hook')=='unknown') + $pingtraxitem->setVar('discover-hook', 'preloader'); + $pingtraxitem = $pluginHandler->setFooterItem($pingtraxitem); + } + } } |
From: <wis...@us...> - 2015-12-01 15:59:12
|
Revision: 13174 http://sourceforge.net/p/xoops/svn/13174 Author: wishcraft Date: 2015-12-01 15:59:10 +0000 (Tue, 01 Dec 2015) Log Message: ----------- Pingtrax -- the Pinglist and Trackback Automated module -- Pre-alpha 1.01 -- Planning Modified Paths: -------------- XoopsModules/pingtrax/trunk/class/plugins.php XoopsModules/pingtrax/trunk/language/english/modinfo.php XoopsModules/pingtrax/trunk/xoops_version.php Modified: XoopsModules/pingtrax/trunk/class/plugins.php =================================================================== --- XoopsModules/pingtrax/trunk/class/plugins.php 2015-12-01 14:58:33 UTC (rev 13173) +++ XoopsModules/pingtrax/trunk/class/plugins.php 2015-12-01 15:59:10 UTC (rev 13174) @@ -72,9 +72,10 @@ foreach(get_declared_classes() as $class) { - if (substr(strtolower($class), 0, strlen($this->getModuleDirname()))==strtolower($this->getModuleDirname()) && (!strpos(strtolower($class), 'categor') && !strpos(strtolower($this->getModulePHPSelf()), 'categor'))) + if ($this->getModuleDirname() != '' && substr(strtolower($class), 0, strlen($this->getModuleDirname()))==strtolower($this->getModuleDirname()) && (!strpos(strtolower($class), 'categor') && !strpos(strtolower($this->getModulePHPSelf()), 'categor'))) { - if (is_a(@new $class(), "XoopsPersistableObjectHandler")) + @$obj = new $class(); + if (is_a($obj, "XoopsPersistableObjectHandler")) return strtolower(str_replace(array(ucfirst($this->getModuleDirname()), $this->getModuleDirname(), 'handler', 'Handler'), '', $class)); } } @@ -93,7 +94,7 @@ { default: - $idnaming = explode(array("\n", "\n\r", "\r\n"), file_get_contents(dirname(__DIR__) . DIRECTORY_SEPARATOR . 'include' . DIRECTORY_SEPARATOR . 'item-id-names.txt')); + $idnaming = explode(PHP_EOL, file_get_contents(dirname(__DIR__) . DIRECTORY_SEPARATOR . 'include' . DIRECTORY_SEPARATOR . 'item-id-names.txt')); foreach($_GET as $key => $value) { if (!is_array($value)) @@ -102,7 +103,7 @@ { if (strpos($key, $idname) && is_numeric($_GET[$key])) $id = $_GET[$key]; - elseif (is_numeric($_GET[$key]) && !in_array($key, explode(array("\n", "\n\r", "\r\n"), file_get_contents(dirname(__DIR__) . DIRECTORY_SEPARATOR . 'include' . DIRECTORY_SEPARATOR . 'exclude-names.txt')))) + elseif (is_numeric($_GET[$key]) && !in_array($key, explode(PHP_EOL, file_get_contents(dirname(__DIR__) . DIRECTORY_SEPARATOR . 'include' . DIRECTORY_SEPARATOR . 'exclude-names.txt')))) $id = $_GET[$key]; } } @@ -147,7 +148,7 @@ { default: - $idnaming = explode(array("\n", "\n\r", "\r\n"), file_get_contents(dirname(__DIR__) . DIRECTORY_SEPARATOR . 'include' . DIRECTORY_SEPARATOR . 'category-id-names.txt')); + $idnaming = explode(PHP_EOL, file_get_contents(dirname(__DIR__) . DIRECTORY_SEPARATOR . 'include' . DIRECTORY_SEPARATOR . 'category-id-names.txt')); foreach($_GET as $key => $value) { if (!is_array($value)) @@ -156,7 +157,7 @@ { if (strpos($key, $idname) && is_numeric($_GET[$key])) $id = $_GET[$key]; - elseif ($id = 0 && is_numeric($_GET[$key]) && !in_array($key, explode(array("\n", "\n\r", "\r\n"), file_get_contents(dirname(__DIR__) . DIRECTORY_SEPARATOR . 'include' . DIRECTORY_SEPARATOR . 'exclude-names.txt')))) + elseif ($id = 0 && is_numeric($_GET[$key]) && !in_array($key, explode(PHP_EOL, file_get_contents(dirname(__DIR__) . DIRECTORY_SEPARATOR . 'include' . DIRECTORY_SEPARATOR . 'exclude-names.txt')))) $id = $_GET[$key]; } } @@ -186,8 +187,6 @@ */ function getItemRefererURI() { - if (parse_url(strtolower(XOOPS_URL), PHP_URL_PATH) == substr(strtolower($_SERVER["REQUEST_URI"]), 0, strlen(parse_url(strtolower(XOOPS_URL), PHP_URL_PATH)))) - return substr($_SERVER["REQUEST_URI"], strlen(parse_url(strtolower(XOOPS_URL), PHP_URL_PATH))-1); return $_SERVER["REQUEST_URI"]; } @@ -340,7 +339,7 @@ */ function getFeedProtocol() { - return parse_url(strtolower($this->_configs['default_feed_url']), PHP_URL_SCHEME); + return parse_url(strtolower(str_replace("%xoops_url%", XOOPS_URL, $this->_configs['default_feed_url'])), PHP_URL_SCHEME); } /** @@ -348,7 +347,7 @@ */ function getFeedDomain() { - return parse_url(strtolower($this->_configs['default_feed_url']), PHP_URL_HOST); + return parse_url(strtolower(str_replace("%xoops_url%", XOOPS_URL, $this->_configs['default_feed_url'])), PHP_URL_HOST); } /** @@ -356,7 +355,7 @@ */ function getFeedRefererURI() { - return parse_url(strtolower($this->_configs['default_feed_url']), PHP_URL_PATH) . "?" .parse_url(strtolower($this->_configs['default_feed_url']), PHP_URL_QUERY); + return parse_url(strtolower(str_replace("%xoops_url%", XOOPS_URL, $this->_configs['default_feed_url'])), PHP_URL_PATH) . "?" .parse_url(strtolower($this->_configs['default_feed_url']), PHP_URL_QUERY); } } @@ -408,6 +407,7 @@ } if (is_object($this->_plugins[$dirname])) { + $ret['type'] = 'local'; $ret['module-dirname'] = $this->_plugins[$dirname]->getModuleDirname(); $ret['module-class'] = $this->_plugins[$dirname]->getModuleClass(); $ret['module-item-id'] = $this->_plugins[$dirname]->getModuleItemID(); @@ -426,9 +426,9 @@ if (!empty($ret)) { $itemsHandler = xoops_getmodulehandler('items', 'pingtrax'); - $item = $itemHandler->create(true); + $item = $itemsHandler->create(true); $item->setVars($ret); - $ret = $itemHandler->get($itemHandler->insert($item)); + $ret = $itemsHandler->get($itemsHandler->insert($item)); } return $ret; } @@ -464,7 +464,7 @@ $item->setVar('item-title', $this->_plugins[$dirname]->getItemTitle()); $item->setVar('item-description', $this->_plugins[$dirname]->getItemTitle()); $itemsHandler = xoops_getmodulehandler('items', 'pingtrax'); - return $itemHandler->get($itemHandler->insert($item)); + return $itemsHandler->get($itemsHandler->insert($item)); } return $item; } Modified: XoopsModules/pingtrax/trunk/language/english/modinfo.php =================================================================== --- XoopsModules/pingtrax/trunk/language/english/modinfo.php 2015-12-01 14:58:33 UTC (rev 13173) +++ XoopsModules/pingtrax/trunk/language/english/modinfo.php 2015-12-01 15:59:10 UTC (rev 13174) @@ -1,14 +1,27 @@ <?php -// $Id: modinfo.php 12363 2014-03-08 10:39:06Z beckmi $ -// _LANGCODE: en -// _CHARSET : UTF-8 -// Translator: XOOPS Translation Team -define('_IPV4_MI_NAME',"IPv4 Debt"); -define('_IPV4_MI_DESC',"Module for displaying the IPv4 debt to Chronolabs Cooperative"); -define('_IPV4_MI_HTACCESS',"Support HTACCESS"); -define('_IPV4_MI_HTACCESS_DESC',"This will enable support for htaccess"); -define('_IPV4_MI_BASEURL',"Base URL for htaccess"); -define('_IPV4_MI_BASEURL_DESC',"This is the base URL of htaccess"); -define('_IPV4_MI_ENDURL',"End of URL"); -define('_IPV4_MI_ENDURL_DESC',""); +/** + * PingTrax Module Global Constants + * + * You may not change or alter any portion of this comment or credits + * of supporting developers from this source code or any supporting source code + * which is considered copyrighted (c) material of the original comment or credit authors. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * @copyright Chronolabs Cooperative http://sourceforge.net/projects/chronolabs/ + * @license GNU GPL 3 (http://labs.coop/briefs/legal/general-public-licence/13,3.html) + * @author Simon Antony Roberts <wis...@us...> + * @see http://sourceforge.net/projects/xoops/ + * @see http://sourceforge.net/projects/chronolabs/ + * @see http://sourceforge.net/projects/chronolabsapi/ + * @see http://labs.coop + * @version 1.0.1 + * @since 1.0.1 + */ +define('_MI_PINGTRAX_NAME',"PingTrax"); +define('_MI_PINGTRAX_DESC',"Module for Automated PingList's and Trackbacks as well as sitemaps in XML!"); +define('_MI_PINGTRAX_DEFAULT_FEED_URL',"Default URL for the RSS Feed Backend"); +define('_MI_PINGTRAX_DEFAULT_FEED_URL_DESC',"This will provide the default URL for the feed, <em>%xoops_url%</em> will be replaced with <em>".XOOPS_URL."</em>"); + Modified: XoopsModules/pingtrax/trunk/xoops_version.php =================================================================== --- XoopsModules/pingtrax/trunk/xoops_version.php 2015-12-01 14:58:33 UTC (rev 13173) +++ XoopsModules/pingtrax/trunk/xoops_version.php 2015-12-01 15:59:10 UTC (rev 13174) @@ -79,31 +79,12 @@ $modversion['hasMain'] = 0; $modversion['config'] = array(); -/* $modversion['config'][] = array( - 'name' => 'htaccess', - 'title' => '_MI_PINGTRAX_HTACCESS', - 'description' => '_MI_PINGTRAX_HTACCESS_DESC', - 'formtype' => 'yesno', - 'valuetype' => 'int', - 'default' => false -); - -$modversion['config'][] = array( - 'name' => 'base_url', - 'title' => '_MI_PINGTRAX_BASEURL', - 'description' => '_MI_PINGTRAX_BASEURL_DESC', - 'formtype' => 'textbox', + 'name' => 'default_feed_url', + 'title' => '_MI_PINGTRAX_DEFAULT_FEED_URL', + 'description' => '_MI_PINGTRAX_DEFAULT_FEED_URL_DESC', + 'formtype' => 'text', 'valuetype' => 'text', - 'default' => "ipv4" + 'default' => '%xoops_url%/backend.php' ); -$modversion['config'][] = array( - 'name' => 'end_url', - 'title' => '_MI_PINGTRAX_ENDURL', - 'description' => '_MI_PINGTRAX_ENDURL_DESC', - 'formtype' => 'textbox', - 'valuetype' => 'text', - 'default' => ".html" -); -*/ |
From: <wis...@us...> - 2015-12-07 11:07:29
|
Revision: 13175 http://sourceforge.net/p/xoops/svn/13175 Author: wishcraft Date: 2015-12-07 11:07:26 +0000 (Mon, 07 Dec 2015) Log Message: ----------- PingTrax Pre-alpha :: More done\!\!\! Modified Paths: -------------- XoopsModules/pingtrax/trunk/class/items.php XoopsModules/pingtrax/trunk/class/items_sitemaps.php XoopsModules/pingtrax/trunk/class/sitemaps.php XoopsModules/pingtrax/trunk/preloads/ping.php XoopsModules/pingtrax/trunk/sql/mysql.sql Added Paths: ----------- XoopsModules/pingtrax/trunk/class/simple_html_dom.php XoopsModules/pingtrax/trunk/templates/sitemaps.xml.html Modified: XoopsModules/pingtrax/trunk/class/items.php =================================================================== --- XoopsModules/pingtrax/trunk/class/items.php 2015-12-01 15:59:10 UTC (rev 13174) +++ XoopsModules/pingtrax/trunk/class/items.php 2015-12-07 11:07:26 UTC (rev 13175) @@ -125,6 +125,29 @@ else return false; } + $sitemapsHandler = xoops_getmodulehandler('sitemaps', 'pingtrax'); + $criteria = new CriteriaCompo(new Criteria('protocol', XOOPS_PROT)); + $criteria->add(new Criteria('domain', parse_url(XOOPS_URL, PHP_URL_HOST))); + $criteria->add(new Criteria('baseurl', parse_url(XOOPS_URL, PHP_URL_PATH))); + if ($sitemapsHandler->getCount($criteria)==0) + { + $sitemap = $sitemapsHandler->create(); + $sitemap->setVar('referer', md5(XOOPS_URL.microtime(true).XOOPS_DB_USER.XOOPS_DB_PASS)); + $sitemap->setVar('protocol', XOOPS_PROT); + $sitemap->setVar('domain', parse_url(XOOPS_URL, PHP_URL_HOST)); + $sitemap->setVar('baseurl', parse_url(XOOPS_URL, PHP_URL_PATH)); + $sitemap->setVar('filename', 'sitemap.'.str_replace("://", "", XOOPS_PROT) . "." . parse_url(XOOPS_URL, PHP_URL_HOST) . '.xml'); + $sitemap = $sitemapsHandler->get($sitemap = $sitemapsHandler->insert($sitemap, true)); + } else { + $obj = $sitemapsHandler->getObjects($criteria, false); + if (is_object($obj[0])) + $sitemap = $obj[0]; + } + $items_sitemapsHandler = xoops_getmodulehandler('items_sitemaps', 'pingtrax'); + $itemsitemap = $items_sitemapsHandler->create(); + $itemsitemap->setVar('map-referer', $sitemap->getVar('referer')); + $itemsitemap->setVar('item-referer', $object->getVar('referer')); + $items_sitemapsHandler->insert($itemsitemap, true); } else { $object->setVar('updated', time()); } @@ -152,4 +175,15 @@ return parent::insert($object, $force); } + function getByReferer($referer = '') + { + $criteria = new CriteriaCompo(new Criteria('referer', $referer)); + $criteria->add(new Criteria('offline', 0)); + if ($this->getCount($criteria)==0) + return NULL; + $objs = $this->getObjects($criteria, false); + if (isset($objs[0]) && is_a($objs[0], "PingtraxItems")) + return $objs[0]; + return NULL; + } } Modified: XoopsModules/pingtrax/trunk/class/items_sitemaps.php =================================================================== --- XoopsModules/pingtrax/trunk/class/items_sitemaps.php 2015-12-01 15:59:10 UTC (rev 13174) +++ XoopsModules/pingtrax/trunk/class/items_sitemaps.php 2015-12-07 11:07:26 UTC (rev 13175) @@ -20,6 +20,7 @@ * @since 1.0.1 */ +require_once __DIR__ . DIRECTORY_SEPARATOR . 'simple_html_dom.php'; /** * Class PingtraxItems_sitemaps @@ -28,14 +29,51 @@ * * Database MySQL Table:- * - * CREATE TABLE `itemtrax_items_sitemaps` ( + * CREATE TABLE `pingtrax_items_sitemaps` ( * `id` mediumint(32) NOT NULL AUTO_INCREMENT, * `map-referer` varchar(44) NOT NULL DEFAULT '', * `item-referer` varchar(44) NOT NULL DEFAULT '', + * `frequency` enum('monthly','fortnightly','weekly','daily') NOT NULL DEFAULT 'monthly', + * `priority` float(2,1) NOT NULL DEFAULT '0.9', + * `checking` int(12) NOT NULL DEFAULT '0', + * `changed` int(12) NOT NULL DEFAULT '0', + * `changes` int(12) NOT NULL DEFAULT '0', * `when` int(12) NOT NULL DEFAULT '0', + * `header-md5` varchar(32) NOT NULL DEFAULT '0', + * `header-changes` int(12) NOT NULL DEFAULT '0', + * `header-changed` int(12) NOT NULL DEFAULT '0', + * `header-bytes` int(12) NOT NULL DEFAULT '0', + * `body-md5` varchar(32) NOT NULL DEFAULT '0', + * `body-changes` int(12) NOT NULL DEFAULT '0', + * `body-changed` int(12) NOT NULL DEFAULT '0', + * `body-bytes` int(12) NOT NULL DEFAULT '0', + * `tabled-md5` varchar(32) NOT NULL DEFAULT '0', + * `tabled-changes` int(12) NOT NULL DEFAULT '0', + * `tabled-changed` int(12) NOT NULL DEFAULT '0', + * `tabled-bytes` int(12) NOT NULL DEFAULT '0', + * `dived-md5` varchar(32) NOT NULL DEFAULT '0', + * `dived-changes` int(12) NOT NULL DEFAULT '0', + * `dived-changed` int(12) NOT NULL DEFAULT '0', + * `dived-bytes` int(12) NOT NULL DEFAULT '0', + * `header-md5-last` varchar(32) NOT NULL DEFAULT '0', + * `header-changes-last` int(12) NOT NULL DEFAULT '0', + * `header-changed-last` int(12) NOT NULL DEFAULT '0', + * `header-bytes-last` int(12) NOT NULL DEFAULT '0', + * `body-md5-last` varchar(32) NOT NULL DEFAULT '0', + * `body-changes-last` int(12) NOT NULL DEFAULT '0', + * `body-changed-last` int(12) NOT NULL DEFAULT '0', + * `body-bytes-last` int(12) NOT NULL DEFAULT '0', + * `tabled-md5-last` varchar(32) NOT NULL DEFAULT '0', + * `tabled-changes-last` int(12) NOT NULL DEFAULT '0', + * `tabled-changed-last` int(12) NOT NULL DEFAULT '0', + * `tabled-bytes-last` int(12) NOT NULL DEFAULT '0', + * `dived-md5-last` varchar(32) NOT NULL DEFAULT '0', + * `dived-changes-last` int(12) NOT NULL DEFAULT '0', + * `dived-changed-last` int(12) NOT NULL DEFAULT '0', + * `dived-bytes-last` int(12) NOT NULL DEFAULT '0', * PRIMARY KEY (`id`), * KEY `SEARCH` (`id`,`map-referer`,`item-referer`) USING BTREE, - * KEY `CHRONOLOGISTICS` (`map-referer`,`item-referer`,`when`) USING BTREE KEY_BLOCK_SIZE=64 + * KEY `CHRONOLOGISTICS` (`map-referer`,`item-referer`) USING BTREE KEY_BLOCK_SIZE=64 * ) ENGINE=InnoDB DEFAULT CHARSET=utf8 PACK_KEYS=1 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC KEY_BLOCK_SIZE=8; * */ @@ -50,9 +88,220 @@ $this->initVar('id', XOBJ_DTYPE_INT, null, false); $this->initVar('map-referer', XOBJ_DTYPE_TXTBOX, null, true, 44); $this->initVar('item-referer', XOBJ_DTYPE_TXTBOX, null, true, 44); - $this->initVar('when', XOBJ_DTYPE_INT, 0, false); + $this->initVar('frequency', XOBJ_DTYPE_ENUM, 'daily', false, false, false, false, false, array('monthly','fortnightly','weekly','daily')); + $this->initVar('priority', XOBJ_DTYPE_FLOAT, 0.9, false); + $this->initVar('checking', XOBJ_DTYPE_INT, time(), false); + $this->initVar('changed', XOBJ_DTYPE_INT, time(), false); + $this->initVar('changes', XOBJ_DTYPE_INT, 0, false); + $this->initVar('when', XOBJ_DTYPE_INT, time(), false); + $this->initVar('header-md5', XOBJ_DTYPE_OTHER, md5(NULL), false, 32); + $this->initVar('header-changes', XOBJ_DTYPE_INT, 0, false); + $this->initVar('header-changed', XOBJ_DTYPE_INT, time(), false); + $this->initVar('header-bytes', XOBJ_DTYPE_INT, 0, false); + $this->initVar('body-md5', XOBJ_DTYPE_OTHER, md5(NULL), false, 32); + $this->initVar('body-changes', XOBJ_DTYPE_INT, 0, false); + $this->initVar('body-changed', XOBJ_DTYPE_INT, time(), false); + $this->initVar('body-bytes', XOBJ_DTYPE_INT, 0, false); + $this->initVar('tabled-md5', XOBJ_DTYPE_OTHER, md5(NULL), false, 32); + $this->initVar('tabled-changes', XOBJ_DTYPE_INT, 0, false); + $this->initVar('tabled-changed', XOBJ_DTYPE_INT, time(), false); + $this->initVar('tabled-bytes', XOBJ_DTYPE_INT, 0, false); + $this->initVar('dived-md5', XOBJ_DTYPE_OTHER, md5(NULL), false, 32); + $this->initVar('dived-changes', XOBJ_DTYPE_INT, 0, false); + $this->initVar('dived-changed', XOBJ_DTYPE_INT, time(), false); + $this->initVar('dived-bytes', XOBJ_DTYPE_INT, 0, false); + $this->initVar('header-md5-last', XOBJ_DTYPE_OTHER, md5(NULL), false, 32); + $this->initVar('header-changes-last', XOBJ_DTYPE_INT, 0, false); + $this->initVar('header-changed-last', XOBJ_DTYPE_INT, time(), false); + $this->initVar('header-bytes-last', XOBJ_DTYPE_INT, 0, false); + $this->initVar('body-md5-last', XOBJ_DTYPE_OTHER, md5(NULL), false, 32); + $this->initVar('body-changes-last', XOBJ_DTYPE_INT, 0, false); + $this->initVar('body-changed-last', XOBJ_DTYPE_INT, time(), false); + $this->initVar('body-bytes-last', XOBJ_DTYPE_INT, 0, false); + $this->initVar('tabled-md5-last', XOBJ_DTYPE_OTHER, md5(NULL), false, 32); + $this->initVar('tabled-changes-last', XOBJ_DTYPE_INT, 0, false); + $this->initVar('tabled-changed-last', XOBJ_DTYPE_INT, time(), false); + $this->initVar('tabled-bytes-last', XOBJ_DTYPE_INT, 0, false); + $this->initVar('dived-md5-last', XOBJ_DTYPE_OTHER, md5(NULL), false, 32); + $this->initVar('dived-changes-last', XOBJ_DTYPE_INT, 0, false); + $this->initVar('dived-changed-last', XOBJ_DTYPE_INT, time(), false); + $this->initVar('dived-bytes-last', XOBJ_DTYPE_INT, 0, false); } + /** + * + */ + function checkForChanges() + { + $changes = 0; + $itemsHandler = xoops_getmodulehandler('items', 'pingtrax'); + $item = $itemsHandler->getByReferer($this->getVar('item-referer')); + if (is_a($item, "PingtraxItems")) + { + $html = $this->getURIData($item->getVar('item-protocol').$item->getVar('item-domain').$item->getVar('item-referer-uri'), 65, 65, $item->getVar('module-get')); + if (strlen($html)==0) + { + foreach($item->getVar('module-get') as $item => $value) + $get[$item] = $value; + $html = $this->getURIData($item->getVar('item-protocol').$item->getVar('item-domain').$item->getVar('item-php-self')."?".http_build_query($get), 65, 65, $get); + } + if (strlen($html)!=0) + { + $dom = str_get_html($html); + // Does headers + $head = $dom->find("head"); + $changes .+ $this->setVars(array('header-md5' => md5($head->innertext), 'header-bytes' => strlen($head->innertext))); + // Does Full Body + $body = $dom->find("body"); + $changes .+ $this->setVars(array('body-md5' => md5($body->plaintext), 'body-bytes' => strlen($body->plaintext))); + // Does Tables + $tablesbytes = 0; + $tablesmd5 = ''; + foreach($dom->find('table') as $table) + { + $tablesmd5 = md5($tablesmd5 . sha1($table->plaintext)); + $tablesbytes = $tablesbytes + strlen($table->plaintext); + } + $changes .+ $this->setVars(array('tabled-md5' => $tablesmd5, 'tabled-bytes' => $tablesbytes)); + // Does Div's + $divsbytes = 0; + $divsmd5 = ''; + foreach($dom->find('div') as $div) + { + $divsmd5 = md5($divsmd5 . sha1($div->plaintext)); + $divsbytes = $divsbytes + strlen($div->plaintext); + } + $changes .+ $this->setVars(array('dived-md5' => $divsmd5, 'dived-bytes' => $divsbytes)); + } + } + return $changes; + } + + /** + * + * {@inheritDoc} + * @see XoopsObject::setVars() + */ + function setVars($var_arr = array()) + { + $changes = 0; + $lasting = array('header' => array('-md5', '-bytes'), 'body' => array('-md5', '-bytes'), 'tabled' => array('-md5', '-bytes'), 'dived' => array('-md5', '-bytes')); + foreach($lasting as $key=> $values) + { + $found = false; + foreach($values as $value) + if (in_array($key.$value, array_keys($var_arr))) + { + if ($this->getVar($key.$value)!=$var_arr[$key.$value]) + foreach($values as $val) + $this->setVar($key.$val.'-last', $this->getVar($key.$val)); + $found = true; + } + if ($found == true) + { + $changes .+ 1; + $this->setVar($key.'-changes', $this->getVar($key.'-changes')+1); + $this->setVar($key.'-changed', time()); + if ($this->getVar('changed')>0) + { + if (time() - $this->getVar('changed') < (3600 * 24)) + { + $this->setvar('frequency', 'daily'); + } elseif (time() - $this->getVar('changed') < (3600 * 24 * 7)) + { + $this->setvar('frequency', 'weekly'); + } elseif (time() - $this->getVar('changed') < (3600 * 24 * 14)) + { + $this->setvar('frequency', 'fortnightly'); + } else { + $this->setvar('frequency', 'monthly'); + } + } else + $this->setvar('frequency', 'daily'); + $this->setVar('changed', time()); + $this->setVar('changes', $this->getVar('changes')+1); + if ($this->getvar('priority') < 0.9) + $this->setVar('priority', $this->getVar('priority') + 0.1); + } else { + if ($this->getVar('changed')>0) + { + if (time() - $this->getVar('changed') < (3600 * 24)) + { + $this->setvar('frequency', 'daily'); + } elseif (time() - $this->getVar('changed') < (3600 * 24 * 7)) + { + $this->setvar('frequency', 'weekly'); + } elseif (time() - $this->getVar('changed') < (3600 * 24 * 14)) + { + $this->setvar('frequency', 'fortnightly'); + } else { + $this->setvar('frequency', 'monthly'); + } + } else { + $this->setvar('frequency', 'daily'); + $this->setVar('changed', time()); + } + if ($this->getvar('frequency')=='') + $this->setvar('frequency', 'daily'); + if ($this->getvar('priority') > 0.1) + $this->setVar('priority', $this->getVar('priority') - 0.1); + } + } + + switch($this->getVar('frequency')) + { + case 'daily': + default: + $this->setvar('frequency', 'daily'); + $this->setVar('checking', time() + (3600 * 24 - 900)); + break; + case 'weekly': + $this->setVar('checking', time() + (3600 * 24 * 7 - 900)); + break; + case 'fortnightly': + $this->setVar('checking', time() + (3600 * 24 * 14 - 900)); + break; + case 'monthly': + $this->setVar('checking', time() + (3600 * 24 * 7 * 4 - 900)); + break; + } + parent::setVars($var_arr); + return ($changes>0?$changes:false); + } + + + /* function getURIData() + * + * cURL Routine + * @author Simon Roberts (Chronolabs) si...@la... + * + * @return float() + */ + private function getURIData($uri = '', $timeout = 65, $connectout = 65, $post_data = array()) + { + if (!function_exists("curl_init")) + { + return file_get_contents($uri); + } + if (!$btt = curl_init($uri)) { + return false; + } + curl_setopt($btt, CURLOPT_HEADER, 0); + curl_setopt($btt, CURLOPT_POST, (count($posts)==0?false:true)); + if (count($posts)!=0) + curl_setopt($btt, CURLOPT_POSTFIELDS, http_build_query($post_data)); + curl_setopt($btt, CURLOPT_CONNECTTIMEOUT, $connectout); + curl_setopt($btt, CURLOPT_TIMEOUT, $timeout); + curl_setopt($btt, CURLOPT_RETURNTRANSFER, true); + curl_setopt($btt, CURLOPT_VERBOSE, false); + curl_setopt($btt, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($btt, CURLOPT_SSL_VERIFYPEER, false); + $data = curl_exec($btt); + curl_close($btt); + return $data; + } + + } /** @@ -69,5 +318,36 @@ parent::__construct($db, "itemtrax_items_sitemaps", 'PingtraxItems_sitemaps', 'id', 'map-referer'); } - + + /** + * + * @param array $array + */ + private function addTimeLimit($seconds = 30) + { + global $timelimit; + $timelimit .+ $seconds; + set_time_limit($timelimit); + } + + /** + * + * @param string $mapreferer + */ + function checkForChanges($mapreferer = '') + { + $changes = 0; + $this->addTimeLimit(120); + $criteria = new CriteriaCompo(new Criteria('checking', time(), "<=")); + if (!empty($mapreferer)) + $criteria->add(new Criteria('map-referer', $mapreferer)); + foreach($this->getObjects($criteria, true) as $id => $item) + { + $start = microtime(true); + if (is_a($item, "PingtraxItems_sitemaps")) + $changes = $changes + $item->checkForChanges(); + $this->addTimeLimit(microtime(true)-$start+5); + } + return $changes; + } } Added: XoopsModules/pingtrax/trunk/class/simple_html_dom.php =================================================================== --- XoopsModules/pingtrax/trunk/class/simple_html_dom.php (rev 0) +++ XoopsModules/pingtrax/trunk/class/simple_html_dom.php 2015-12-07 11:07:26 UTC (rev 13175) @@ -0,0 +1,1742 @@ +<?php +/** + * Website: http://sourceforge.net/projects/simplehtmldom/ + * Additional projects that may be used: http://sourceforge.net/projects/debugobject/ + * Acknowledge: Jose Solorzano (https://sourceforge.net/projects/php-html/) + * Contributions by: + * Yousuke Kumakura (Attribute filters) + * Vadim Voituk (Negative indexes supports of "find" method) + * Antcs (Constructor with automatically load contents either text or file/url) + * + * all affected sections have comments starting with "PaperG" + * + * Paperg - Added case insensitive testing of the value of the selector. + * Paperg - Added tag_start for the starting index of tags - NOTE: This works but not accurately. + * This tag_start gets counted AFTER \r\n have been crushed out, and after the remove_noice calls so it will not reflect the REAL position of the tag in the source, + * it will almost always be smaller by some amount. + * We use this to determine how far into the file the tag in question is. This "percentage will never be accurate as the $dom->size is the "real" number of bytes the dom was created from. + * but for most purposes, it's a really good estimation. + * Paperg - Added the forceTagsClosed to the dom constructor. Forcing tags closed is great for malformed html, but it CAN lead to parsing errors. + * Allow the user to tell us how much they trust the html. + * Paperg add the text and plaintext to the selectors for the find syntax. plaintext implies text in the innertext of a node. text implies that the tag is a text node. + * This allows for us to find tags based on the text they contain. + * Create find_ancestor_tag to see if a tag is - at any level - inside of another specific tag. + * Paperg: added parse_charset so that we know about the character set of the source document. + * NOTE: If the user's system has a routine called get_last_retrieve_url_contents_content_type availalbe, we will assume it's returning the content-type header from the + * last transfer or curl_exec, and we will parse that and use it in preference to any other method of charset detection. + * + * Found infinite loop in the case of broken html in restore_noise. Rewrote to protect from that. + * PaperG (John Schlick) Added get_display_size for "IMG" tags. + * + * Licensed under The MIT License + * Redistributions of files must retain the above copyright notice. + * + * @author S.C. Chen <me5...@gm...> + * @author John Schlick + * @author Rus Carroll + * @version 1.5 ($Rev: 210 $) + * @package PlaceLocalInclude + * @subpackage simple_html_dom + */ + +/** + * All of the Defines for the classes below. + * @author S.C. Chen <me5...@gm...> + */ +define('HDOM_TYPE_ELEMENT', 1); +define('HDOM_TYPE_COMMENT', 2); +define('HDOM_TYPE_TEXT', 3); +define('HDOM_TYPE_ENDTAG', 4); +define('HDOM_TYPE_ROOT', 5); +define('HDOM_TYPE_UNKNOWN', 6); +define('HDOM_QUOTE_DOUBLE', 0); +define('HDOM_QUOTE_SINGLE', 1); +define('HDOM_QUOTE_NO', 3); +define('HDOM_INFO_BEGIN', 0); +define('HDOM_INFO_END', 1); +define('HDOM_INFO_QUOTE', 2); +define('HDOM_INFO_SPACE', 3); +define('HDOM_INFO_TEXT', 4); +define('HDOM_INFO_INNER', 5); +define('HDOM_INFO_OUTER', 6); +define('HDOM_INFO_ENDSPACE',7); +define('DEFAULT_TARGET_CHARSET', 'UTF-8'); +define('DEFAULT_BR_TEXT', "\r\n"); +define('DEFAULT_SPAN_TEXT', " "); +define('MAX_FILE_SIZE', 600000); +// helper functions +// ----------------------------------------------------------------------------- +// get html dom from file +// $maxlen is defined in the code as PHP_STREAM_COPY_ALL which is defined as -1. +function file_get_html($url, $use_include_path = false, $context=null, $offset = -1, $maxLen=-1, $lowercase = true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT) +{ + // We DO force the tags to be terminated. + $dom = new simple_html_dom(null, $lowercase, $forceTagsClosed, $target_charset, $stripRN, $defaultBRText, $defaultSpanText); + // For sourceforge users: uncomment the next line and comment the retreive_url_contents line 2 lines down if it is not already done. + $contents = file_get_contents($url, $use_include_path, $context, $offset); + // Paperg - use our own mechanism for getting the contents as we want to control the timeout. + //$contents = retrieve_url_contents($url); + if (empty($contents) || strlen($contents) > MAX_FILE_SIZE) + { + return false; + } + // The second parameter can force the selectors to all be lowercase. + $dom->load($contents, $lowercase, $stripRN); + return $dom; +} + +// get html dom from string +function str_get_html($str, $lowercase=true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT) +{ + $dom = new simple_html_dom(null, $lowercase, $forceTagsClosed, $target_charset, $stripRN, $defaultBRText, $defaultSpanText); + if (empty($str) || strlen($str) > MAX_FILE_SIZE) + { + $dom->clear(); + return false; + } + $dom->load($str, $lowercase, $stripRN); + return $dom; +} + +// dump html dom tree +function dump_html_tree($node, $show_attr=true, $deep=0) +{ + $node->dump($node); +} + + +/** + * simple html dom node + * PaperG - added ability for "find" routine to lowercase the value of the selector. + * PaperG - added $tag_start to track the start position of the tag in the total byte index + * + * @package PlaceLocalInclude + */ +class simple_html_dom_node +{ + public $nodetype = HDOM_TYPE_TEXT; + public $tag = 'text'; + public $attr = array(); + public $children = array(); + public $nodes = array(); + public $parent = null; + // The "info" array - see HDOM_INFO_... for what each element contains. + public $_ = array(); + public $tag_start = 0; + private $dom = null; + + function __construct($dom) + { + $this->dom = $dom; + $dom->nodes[] = $this; + } + + function __destruct() + { + $this->clear(); + } + + function __toString() + { + return $this->outertext(); + } + + // clean up memory due to php5 circular references memory leak... + function clear() + { + $this->dom = null; + $this->nodes = null; + $this->parent = null; + $this->children = null; + } + + // dump node's tree + function dump($show_attr=true, $deep=0) + { + $lead = str_repeat(' ', $deep); + + echo $lead.$this->tag; + if ($show_attr && count($this->attr)>0) + { + echo '('; + foreach ($this->attr as $k=>$v) + echo "[$k]=>\"".$this->$k.'", '; + echo ')'; + } + echo "\n"; + + if ($this->nodes) + { + foreach ($this->nodes as $c) + { + $c->dump($show_attr, $deep+1); + } + } + } + + + // Debugging function to dump a single dom node with a bunch of information about it. + function dump_node($echo=true) + { + + $string = $this->tag; + if (count($this->attr)>0) + { + $string .= '('; + foreach ($this->attr as $k=>$v) + { + $string .= "[$k]=>\"".$this->$k.'", '; + } + $string .= ')'; + } + if (count($this->_)>0) + { + $string .= ' $_ ('; + foreach ($this->_ as $k=>$v) + { + if (is_array($v)) + { + $string .= "[$k]=>("; + foreach ($v as $k2=>$v2) + { + $string .= "[$k2]=>\"".$v2.'", '; + } + $string .= ")"; + } else { + $string .= "[$k]=>\"".$v.'", '; + } + } + $string .= ")"; + } + + if (isset($this->text)) + { + $string .= " text: (" . $this->text . ")"; + } + + $string .= " HDOM_INNER_INFO: '"; + if (isset($node->_[HDOM_INFO_INNER])) + { + $string .= $node->_[HDOM_INFO_INNER] . "'"; + } + else + { + $string .= ' NULL '; + } + + $string .= " children: " . count($this->children); + $string .= " nodes: " . count($this->nodes); + $string .= " tag_start: " . $this->tag_start; + $string .= "\n"; + + if ($echo) + { + echo $string; + return; + } + else + { + return $string; + } + } + + // returns the parent of node + // If a node is passed in, it will reset the parent of the current node to that one. + function parent($parent=null) + { + // I am SURE that this doesn't work properly. + // It fails to unset the current node from it's current parents nodes or children list first. + if ($parent !== null) + { + $this->parent = $parent; + $this->parent->nodes[] = $this; + $this->parent->children[] = $this; + } + + return $this->parent; + } + + // verify that node has children + function has_child() + { + return !empty($this->children); + } + + // returns children of node + function children($idx=-1) + { + if ($idx===-1) + { + return $this->children; + } + if (isset($this->children[$idx])) + { + return $this->children[$idx]; + } + return null; + } + + // returns the first child of node + function first_child() + { + if (count($this->children)>0) + { + return $this->children[0]; + } + return null; + } + + // returns the last child of node + function last_child() + { + if (($count=count($this->children))>0) + { + return $this->children[$count-1]; + } + return null; + } + + // returns the next sibling of node + function next_sibling() + { + if ($this->parent===null) + { + return null; + } + + $idx = 0; + $count = count($this->parent->children); + while ($idx<$count && $this!==$this->parent->children[$idx]) + { + ++$idx; + } + if (++$idx>=$count) + { + return null; + } + return $this->parent->children[$idx]; + } + + // returns the previous sibling of node + function prev_sibling() + { + if ($this->parent===null) return null; + $idx = 0; + $count = count($this->parent->children); + while ($idx<$count && $this!==$this->parent->children[$idx]) + ++$idx; + if (--$idx<0) return null; + return $this->parent->children[$idx]; + } + + // function to locate a specific ancestor tag in the path to the root. + function find_ancestor_tag($tag) + { + global $debug_object; + if (is_object($debug_object)) { $debug_object->debug_log_entry(1); } + + // Start by including ourselves in the comparison. + $returnDom = $this; + + while (!is_null($returnDom)) + { + if (is_object($debug_object)) { $debug_object->debug_log(2, "Current tag is: " . $returnDom->tag); } + + if ($returnDom->tag == $tag) + { + break; + } + $returnDom = $returnDom->parent; + } + return $returnDom; + } + + // get dom node's inner html + function innertext() + { + if (isset($this->_[HDOM_INFO_INNER])) return $this->_[HDOM_INFO_INNER]; + if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]); + + $ret = ''; + foreach ($this->nodes as $n) + $ret .= $n->outertext(); + return $ret; + } + + // get dom node's outer text (with tag) + function outertext() + { + global $debug_object; + if (is_object($debug_object)) + { + $text = ''; + if ($this->tag == 'text') + { + if (!empty($this->text)) + { + $text = " with text: " . $this->text; + } + } + $debug_object->debug_log(1, 'Innertext of tag: ' . $this->tag . $text); + } + + if ($this->tag==='root') return $this->innertext(); + + // trigger callback + if ($this->dom && $this->dom->callback!==null) + { + call_user_func_array($this->dom->callback, array($this)); + } + + if (isset($this->_[HDOM_INFO_OUTER])) return $this->_[HDOM_INFO_OUTER]; + if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]); + + // render begin tag + if ($this->dom && $this->dom->nodes[$this->_[HDOM_INFO_BEGIN]]) + { + $ret = $this->dom->nodes[$this->_[HDOM_INFO_BEGIN]]->makeup(); + } else { + $ret = ""; + } + + // render inner text + if (isset($this->_[HDOM_INFO_INNER])) + { + // If it's a br tag... don't return the HDOM_INNER_INFO that we may or may not have added. + if ($this->tag != "br") + { + $ret .= $this->_[HDOM_INFO_INNER]; + } + } else { + if ($this->nodes) + { + foreach ($this->nodes as $n) + { + $ret .= $this->convert_text($n->outertext()); + } + } + } + + // render end tag + if (isset($this->_[HDOM_INFO_END]) && $this->_[HDOM_INFO_END]!=0) + $ret .= '</'.$this->tag.'>'; + return $ret; + } + + // get dom node's plain text + function text() + { + if (isset($this->_[HDOM_INFO_INNER])) return $this->_[HDOM_INFO_INNER]; + switch ($this->nodetype) + { + case HDOM_TYPE_TEXT: return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]); + case HDOM_TYPE_COMMENT: return ''; + case HDOM_TYPE_UNKNOWN: return ''; + } + if (strcasecmp($this->tag, 'script')===0) return ''; + if (strcasecmp($this->tag, 'style')===0) return ''; + + $ret = ''; + // In rare cases, (always node type 1 or HDOM_TYPE_ELEMENT - observed for some span tags, and some p tags) $this->nodes is set to NULL. + // NOTE: This indicates that there is a problem where it's set to NULL without a clear happening. + // WHY is this happening? + if (!is_null($this->nodes)) + { + foreach ($this->nodes as $n) + { + $ret .= $this->convert_text($n->text()); + } + + // If this node is a span... add a space at the end of it so multiple spans don't run into each other. This is plaintext after all. + if ($this->tag == "span") + { + $ret .= $this->dom->default_span_text; + } + + + } + return $ret; + } + + function xmltext() + { + $ret = $this->innertext(); + $ret = str_ireplace('<![CDATA[', '', $ret); + $ret = str_replace(']]>', '', $ret); + return $ret; + } + + // build node's text with tag + function makeup() + { + // text, comment, unknown + if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]); + + $ret = '<'.$this->tag; + $i = -1; + + foreach ($this->attr as $key=>$val) + { + ++$i; + + // skip removed attribute + if ($val===null || $val===false) + continue; + + $ret .= $this->_[HDOM_INFO_SPACE][$i][0]; + //no value attr: nowrap, checked selected... + if ($val===true) + $ret .= $key; + else { + switch ($this->_[HDOM_INFO_QUOTE][$i]) + { + case HDOM_QUOTE_DOUBLE: $quote = '"'; break; + case HDOM_QUOTE_SINGLE: $quote = '\''; break; + default: $quote = ''; + } + $ret .= $key.$this->_[HDOM_INFO_SPACE][$i][1].'='.$this->_[HDOM_INFO_SPACE][$i][2].$quote.$val.$quote; + } + } + $ret = $this->dom->restore_noise($ret); + return $ret . $this->_[HDOM_INFO_ENDSPACE] . '>'; + } + + // find elements by css selector + //PaperG - added ability for find to lowercase the value of the selector. + function find($selector, $idx=null, $lowercase=false) + { + $selectors = $this->parse_selector($selector); + if (($count=count($selectors))===0) return array(); + $found_keys = array(); + + // find each selector + for ($c=0; $c<$count; ++$c) + { + // The change on the below line was documented on the sourceforge code tracker id 2788009 + // used to be: if (($levle=count($selectors[0]))===0) return array(); + if (($levle=count($selectors[$c]))===0) return array(); + if (!isset($this->_[HDOM_INFO_BEGIN])) return array(); + + $head = array($this->_[HDOM_INFO_BEGIN]=>1); + + // handle descendant selectors, no recursive! + for ($l=0; $l<$levle; ++$l) + { + $ret = array(); + foreach ($head as $k=>$v) + { + $n = ($k===-1) ? $this->dom->root : $this->dom->nodes[$k]; + //PaperG - Pass this optional parameter on to the seek function. + $n->seek($selectors[$c][$l], $ret, $lowercase); + } + $head = $ret; + } + + foreach ($head as $k=>$v) + { + if (!isset($found_keys[$k])) + { + $found_keys[$k] = 1; + } + } + } + + // sort keys + ksort($found_keys); + + $found = array(); + foreach ($found_keys as $k=>$v) + $found[] = $this->dom->nodes[$k]; + + // return nth-element or array + if (is_null($idx)) return $found; + else if ($idx<0) $idx = count($found) + $idx; + return (isset($found[$idx])) ? $found[$idx] : null; + } + + // seek for given conditions + // PaperG - added parameter to allow for case insensitive testing of the value of a selector. + protected function seek($selector, &$ret, $lowercase=false) + { + global $debug_object; + if (is_object($debug_object)) { $debug_object->debug_log_entry(1); } + + list($tag, $key, $val, $exp, $no_key) = $selector; + + // xpath index + if ($tag && $key && is_numeric($key)) + { + $count = 0; + foreach ($this->children as $c) + { + if ($tag==='*' || $tag===$c->tag) { + if (++$count==$key) { + $ret[$c->_[HDOM_INFO_BEGIN]] = 1; + return; + } + } + } + return; + } + + $end = (!empty($this->_[HDOM_INFO_END])) ? $this->_[HDOM_INFO_END] : 0; + if ($end==0) { + $parent = $this->parent; + while (!isset($parent->_[HDOM_INFO_END]) && $parent!==null) { + $end -= 1; + $parent = $parent->parent; + } + $end += $parent->_[HDOM_INFO_END]; + } + + for ($i=$this->_[HDOM_INFO_BEGIN]+1; $i<$end; ++$i) { + $node = $this->dom->nodes[$i]; + + $pass = true; + + if ($tag==='*' && !$key) { + if (in_array($node, $this->children, true)) + $ret[$i] = 1; + continue; + } + + // compare tag + if ($tag && $tag!=$node->tag && $tag!=='*') {$pass=false;} + // compare key + if ($pass && $key) { + if ($no_key) { + if (isset($node->attr[$key])) $pass=false; + } else { + if (($key != "plaintext") && !isset($node->attr[$key])) $pass=false; + } + } + // compare value + if ($pass && $key && $val && $val!=='*') { + // If they have told us that this is a "plaintext" search then we want the plaintext of the node - right? + if ($key == "plaintext") { + // $node->plaintext actually returns $node->text(); + $nodeKeyValue = $node->text(); + } else { + // this is a normal search, we want the value of that attribute of the tag. + $nodeKeyValue = $node->attr[$key]; + } + if (is_object($debug_object)) {$debug_object->debug_log(2, "testing node: " . $node->tag . " for attribute: " . $key . $exp . $val . " where nodes value is: " . $nodeKeyValue);} + + //PaperG - If lowercase is set, do a case insensitive test of the value of the selector. + if ($lowercase) { + $check = $this->match($exp, strtolower($val), strtolower($nodeKeyValue)); + } else { + $check = $this->match($exp, $val, $nodeKeyValue); + } + if (is_object($debug_object)) {$debug_object->debug_log(2, "after match: " . ($check ? "true" : "false"));} + + // handle multiple class + if (!$check && strcasecmp($key, 'class')===0) { + foreach (explode(' ',$node->attr[$key]) as $k) { + // Without this, there were cases where leading, trailing, or double spaces lead to our comparing blanks - bad form. + if (!empty($k)) { + if ($lowercase) { + $check = $this->match($exp, strtolower($val), strtolower($k)); + } else { + $check = $this->match($exp, $val, $k); + } + if ($check) break; + } + } + } + if (!$check) $pass = false; + } + if ($pass) $ret[$i] = 1; + unset($node); + } + // It's passed by reference so this is actually what this function returns. + if (is_object($debug_object)) {$debug_object->debug_log(1, "EXIT - ret: ", $ret);} + } + + protected function match($exp, $pattern, $value) { + global $debug_object; + if (is_object($debug_object)) {$debug_object->debug_log_entry(1);} + + switch ($exp) { + case '=': + return ($value===$pattern); + case '!=': + return ($value!==$pattern); + case '^=': + return preg_match("/^".preg_quote($pattern,'/')."/", $value); + case '$=': + return preg_match("/".preg_quote($pattern,'/')."$/", $value); + case '*=': + if ($pattern[0]=='/') { + return preg_match($pattern, $value); + } + return preg_match("/".$pattern."/i", $value); + } + return false; + } + + protected function parse_selector($selector_string) { + global $debug_object; + if (is_object($debug_object)) {$debug_object->debug_log_entry(1);} + + // pattern of CSS selectors, modified from mootools + // Paperg: Add the colon to the attrbute, so that it properly finds <tag attr:ibute="something" > like google does. + // Note: if you try to look at this attribute, yo MUST use getAttribute since $dom->x:y will fail the php syntax check. +// Notice the \[ starting the attbute? and the @? following? This implies that an attribute can begin with an @ sign that is not captured. +// This implies that an html attribute specifier may start with an @ sign that is NOT captured by the expression. +// farther study is required to determine of this should be documented or removed. +// $pattern = "/([\w-:\*]*)(?:\#([\w-]+)|\.([\w-]+))?(?:\[@?(!?[\w-]+)(?:([!*^$]?=)[\"']?(.*?)[\"']?)?\])?([\/, ]+)/is"; + $pattern = "/([\w-:\*]*)(?:\#([\w-]+)|\.([\w-]+))?(?:\[@?(!?[\w-:]+)(?:([!*^$]?=)[\"']?(.*?)[\"']?)?\])?([\/, ]+)/is"; + preg_match_all($pattern, trim($selector_string).' ', $matches, PREG_SET_ORDER); + if (is_object($debug_object)) {$debug_object->debug_log(2, "Matches Array: ", $matches);} + + $selectors = array(); + $result = array(); + //print_r($matches); + + foreach ($matches as $m) { + $m[0] = trim($m[0]); + if ($m[0]==='' || $m[0]==='/' || $m[0]==='//') continue; + // for browser generated xpath + if ($m[1]==='tbody') continue; + + list($tag, $key, $val, $exp, $no_key) = array($m[1], null, null, '=', false); + if (!empty($m[2])) {$key='id'; $val=$m[2];} + if (!empty($m[3])) {$key='class'; $val=$m[3];} + if (!empty($m[4])) {$key=$m[4];} + if (!empty($m[5])) {$exp=$m[5];} + if (!empty($m[6])) {$val=$m[6];} + + // convert to lowercase + if ($this->dom->lowercase) {$tag=strtolower($tag); $key=strtolower($key);} + //elements that do NOT have the specified attribute + if (isset($key[0]) && $key[0]==='!') {$key=substr($key, 1); $no_key=true;} + + $result[] = array($tag, $key, $val, $exp, $no_key); + if (trim($m[7])===',') { + $selectors[] = $result; + $result = array(); + } + } + if (count($result)>0) + $selectors[] = $result; + return $selectors; + } + + function __get($name) + { + if (isset($this->attr[$name])) + { + return $this->convert_text($this->attr[$name]); + } + switch ($name) + { + case 'outertext': return $this->outertext(); + case 'innertext': return $this->innertext(); + case 'plaintext': return $this->text(); + case 'xmltext': return $this->xmltext(); + default: return array_key_exists($name, $this->attr); + } + } + + function __set($name, $value) + { + global $debug_object; + if (is_object($debug_object)) {$debug_object->debug_log_entry(1);} + + switch ($name) + { + case 'outertext': return $this->_[HDOM_INFO_OUTER] = $value; + case 'innertext': + if (isset($this->_[HDOM_INFO_TEXT])) return $this->_[HDOM_INFO_TEXT] = $value; + return $this->_[HDOM_INFO_INNER] = $value; + } + if (!isset($this->attr[$name])) + { + $this->_[HDOM_INFO_SPACE][] = array(' ', '', ''); + $this->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_DOUBLE; + } + $this->attr[$name] = $value; + } + + function __isset($name) + { + switch ($name) + { + case 'outertext': return true; + case 'innertext': return true; + case 'plaintext': return true; + } + //no value attr: nowrap, checked selected... + return (array_key_exists($name, $this->attr)) ? true : isset($this->attr[$name]); + } + + function __unset($name) { + if (isset($this->attr[$name])) + unset($this->attr[$name]); + } + + // PaperG - Function to convert the text from one character set to another if the two sets are not the same. + function convert_text($text) + { + global $debug_object; + if (is_object($debug_object)) {$debug_object->debug_log_entry(1);} + + $converted_text = $text; + + $sourceCharset = ""; + $targetCharset = ""; + + if ($this->dom) + { + $sourceCharset = strtoupper($this->dom->_charset); + $targetCharset = strtoupper($this->dom->_target_charset); + } + if (is_object($debug_object)) {$debug_object->debug_log(3, "source charset: " . $sourceCharset . " target charaset: " . $targetCharset);} + + if (!empty($sourceCharset) && !empty($targetCharset) && (strcasecmp($sourceCharset, $targetCharset) != 0)) + { + // Check if the reported encoding could have been incorrect and the text is actually already UTF-8 + if ((strcasecmp($targetCharset, 'UTF-8') == 0) && ($this->is_utf8($text))) + { + $converted_text = $text; + } + else + { + $converted_text = iconv($sourceCharset, $targetCharset, $text); + } + } + + // Lets make sure that we don't have that silly BOM issue with any of the utf-8 text we output. + if ($targetCharset == 'UTF-8') + { + if (substr($converted_text, 0, 3) == "\xef\xbb\xbf") + { + $converted_text = substr($converted_text, 3); + } + if (substr($converted_text, -3) == "\xef\xbb\xbf") + { + $converted_text = substr($converted_text, 0, -3); + } + } + + return $converted_text; + } + + /** + * Returns true if $string is valid UTF-8 and false otherwise. + * + * @param mixed $str String to be tested + * @return boolean + */ + static function is_utf8($str) + { + $c=0; $b=0; + $bits=0; + $len=strlen($str); + for($i=0; $i<$len; $i++) + { + $c=ord($str[$i]); + if($c > 128) + { + if(($c >= 254)) return false; + elseif($c >= 252) $bits=6; + elseif($c >= 248) $bits=5; + elseif($c >= 240) $bits=4; + elseif($c >= 224) $bits=3; + elseif($c >= 192) $bits=2; + else return false; + if(($i+$bits) > $len) return false; + while($bits > 1) + { + $i++; + $b=ord($str[$i]); + if($b < 128 || $b > 191) return false; + $bits--; + } + } + } + return true; + } + /* + function is_utf8($string) + { + //this is buggy + return (utf8_encode(utf8_decode($string)) == $string); + } + */ + + /** + * Function to try a few tricks to determine the displayed size of an img on the page. + * NOTE: This will ONLY work on an IMG tag. Returns FALSE on all other tag types. + * + * @author John Schlick + * @version April 19 2012 + * @return array an array containing the 'height' and 'width' of the image on the page or -1 if we can't figure it out. + */ + function get_display_size() + { + global $debug_object; + + $width = -1; + $height = -1; + + if ($this->tag !== 'img') + { + return false; + } + + // See if there is aheight or width attribute in the tag itself. + if (isset($this->attr['width'])) + { + $width = $this->attr['width']; + } + + if (isset($this->attr['height'])) + { + $height = $this->attr['height']; + } + + // Now look for an inline style. + if (isset($this->attr['style'])) + { + // Thanks to user gnarf from stackoverflow for this regular expression. + $attributes = array(); + preg_match_all("/([\w-]+)\s*:\s*([^;]+)\s*;?/", $this->attr['style'], $matches, PREG_SET_ORDER); + foreach ($matches as $match) { + $attributes[$match[1]] = $match[2]; + } + + // If there is a width in the style attributes: + if (isset($attributes['width']) && $width == -1) + { + // check that the last two characters are px (pixels) + if (strtolower(substr($attributes['width'], -2)) == 'px') + { + $proposed_width = substr($attributes['width'], 0, -2); + // Now make sure that it's an integer and not something stupid. + if (filter_var($proposed_width, FILTER_VALIDATE_INT)) + { + $width = $proposed_width; + } + } + } + + // If there is a width in the style attributes: + if (isset($attributes['height']) && $height == -1) + { + // check that the last two characters are px (pixels) + if (strtolower(substr($attributes['height'], -2)) == 'px') + { + $proposed_height = substr($attributes['height'], 0, -2); + // Now make sure that it's an integer and not something stupid. + if (filter_var($proposed_height, FILTER_VALIDATE_INT)) + { + $height = $proposed_height; + } + } + } + + } + + // Future enhancement: + // Look in the tag to see if there is a class or id specified that has a height or width attribute to it. + + // Far future enhancement + // Look at all the parent tags of this image to see if they specify a class or id that has an img selector that specifies a height or width + // Note that in this case, the class or id will have the img subselector for it to apply to the image. + + // ridiculously far future development + // If the class or id is specified in a SEPARATE css file thats not on the page, go get it and do what we were just doing for the ones on the page. + + $result = array('height' => $height, + 'width' => $width); + return $result; + } + + // camel naming conventions + function getAllAttributes() {return $this->attr;} + function getAttribute($name) {return $this->__get($name);} + function setAttribute($name, $value) {$this->__set($name, $value);} + function hasAttribute($name) {return $this->__isset($name);} + function removeAttribute($name) {$this->__set($name, null);} + function getElementById($id) {return $this->find("#$id", 0);} + function getElementsById($id, $idx=null) {return $this->find("#$id", $idx);} + function getElementByTagName($name) {return $this->find($name, 0);} + function getElementsByTagName($name, $idx=null) {return $this->find($name, $idx);} + function parentNode() {return $this->parent();} + function childNodes($idx=-1) {return $this->children($idx);} + function firstChild() {return $this->first_child();} + function lastChild() {return $this->last_child();} + function nextSibling() {return $this->next_sibling();} + function previousSibling() {return $this->prev_sibling();} + function hasChildNodes() {return $this->has_child();} + function nodeName() {return $this->tag;} + function appendChild($node) {$node->parent($this); return $node;} + +} + +/** + * simple html dom parser + * Paperg - in the find routine: allow us to specify that we want case insensitive testing of the value of the selector. + * Paperg - change $size from protected to public so we can easily access it + * Paperg - added ForceTagsClosed in the constructor which tells us whether we trust the html or not. Default is to NOT trust it. + * + * @package PlaceLocalInclude + */ +class simple_html_dom +{ + public $root = null; + public $nodes = array(); + public $callback = null; + public $lowercase = false; + // Used to keep track of how large the text was when we started. + public $original_size; + public $size; + protected $pos; + protected $doc; + protected $char; + protected $cursor; + protected $parent; + protected $noise = array(); + protected $token_blank = " \t\r\n"; + protected $token_equal = ' =/>'; + protected $token_slash = " />\r\n\t"; + protected $token_attr = ' >'; + // Note that this is referenced by a child node, and so it needs to be public for that node to see this information. + public $_charset = ''; + public $_target_charset = ''; + protected $default_br_text = ""; + public $default_span_text = ""; + + // use isset instead of in_array, performance boost about 30%... + protected $self_closing_tags = array('img'=>1, 'br'=>1, 'input'=>1, 'meta'=>1, 'link'=>1, 'hr'=>1, 'base'=>1, 'embed'=>1, 'spacer'=>1); + protected $block_tags = array('root'=>1, 'body'=>1, 'form'=>1, 'div'=>1, 'span'=>1, 'table'=>1); + // Known sourceforge issue #2977341 + // B tags that are not closed cause us to return everything to the end of the document. + protected $optional_closing_tags = array( + 'tr'=>array('tr'=>1, 'td'=>1, 'th'=>1), + 'th'=>array('th'=>1), + 'td'=>array('td'=>1), + 'li'=>array('li'=>1), + 'dt'=>array('dt'=>1, 'dd'=>1), + 'dd'=>array('dd'=>1, 'dt'=>1), + 'dl'=>array('dd'=>1, 'dt'=>1), + 'p'=>array('p'=>1), + 'nobr'=>array('nobr'=>1), + 'b'=>array('b'=>1), + 'option'=>array('option'=>1), + ); + + function __construct($str=null, $lowercase=true, $forceTagsClosed=true, $target_charset=DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT) + { + if ($str) + { + if (preg_match("/^http:\/\//i",$str) || is_file($str)) + { + $this->load_file($str); + } + else + { + $this->load($str, $lowercase, $stripRN, $defaultBRText, $defaultSpanText); + } + } + // Forcing tags to be closed implies that we don't trust the html, but it can lead to parsing errors if we SHOULD trust the html. + if (!$forceTagsClosed) { + $this->optional_closing_array=array(); + } + $this->_target_charset = $target_charset; + } + + function __destruct() + { + $this->clear(); + } + + // load html from string + function load($str, $lowercase=true, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT) + { + global $debug_object; + + // prepare + $this->prepare($str, $lowercase, $stripRN, $defaultBRText, $defaultSpanText); + // strip out cdata + $this->remove_noise("'<!\[CDATA\[(.*?)\]\]>'is", true); + // strip out comments + $this->remove_noise("'<!--(.*?)-->'is"); + // Per sourceforge http://sourceforge.net/tracker/?func=detail&aid=2949097&group_id=218559&atid=1044037 + // Script tags removal now preceeds style tag removal. + // strip out <script> tags + $this->remove_noise("'<\s*script[^>]*[^/]>(.*?)<\s*/\s*script\s*>'is"); + $this->remove_noise("'<\s*script\s*>(.*?)<\s*/\s*script\s*>'is"); + // strip out <style> tags + $this->remove_noise("'<\s*style[^>]*[^/]>(.*?)<\s*/\s*style\s*>'is"); + $this->remove_noise("'<\s*style\s*>(.*?)<\s*/\s*style\s*>'is"); + // strip out preformatted tags + $this->remove_noise("'<\s*(?:code)[^>]*>(.*?)<\s*/\s*(?:code)\s*>'is"); + // strip out server side scripts + $this->remove_noise("'(<\?)(.*?)(\?>)'s", true); + // strip smarty scripts + $this->remove_noise("'(\{\w)(.*?)(\})'s", true); + + // parsing + while ($this->parse()); + // end + $this->root->_[HDOM_INFO_END] = $this->cursor; + $this->parse_charset(); + + // make load function chainable + return $this; + + } + + // load html from file + function load_file() + { + $args = func_get_args(); + $this->load(call_user_func_array('file_get_contents', $args), true); + // Throw an error if we can't properly load the dom. + if (($error=error_get_last())!==null) { + $this->clear(); + return false; + } + } + + // set callback function + function set_callback($function_name) + { + $this->callback = $function_name; + } + + // remove callback function + function remove_callback() + { + $this->callback = null; + } + + // save dom as string + function save($filepath='') + { + $ret = $this->root->innertext(); + if ($filepath!=='') file_put_contents($filepath, $ret, LOCK_EX); + return $ret; + } + + // find dom node by css selector + // Paperg - allow us to specify that we want case insensitive testing of the value of the selector. + function find($selector, $idx=null, $lowercase=false) + { + return $this->root->find($selector, $idx, $lowercase); + } + + // clean up memory due to php5 circular references memory leak... + function clear() + { + foreach ($this->nodes as $n) {$n->clear(); $n = null;} + // This add next line is documented in the sourceforge repository. 2977248 as a fix for ongoing memory leaks that occur even with the use of clear. + if (isset($this->children)) foreach ($this->children as $n) {$n->clear(); $n = null;} + if (isset($this->parent)) {$this->parent->clear(); unset($this->parent);} + if (isset($this->root)) {$this->root->clear(); unset($this->root);} + unset($this->doc); + unset($this->noise); + } + + function dump($show_attr=true) + { + $this->root->dump($show_attr); + } + + // prepare HTML data and init everything + protected function prepare($str, $lowercase=true, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT) + { + $this->clear(); + + // set the length of content before we do anything to it. + $this->size = strlen($str); + // Save the original size of the html that we got in. It might be useful to someone. + $this->original_size = $this->size; + + //before we save the string as the doc... strip out the \r \n's if we are told to. + if ($stripRN) { + $str = str_replace("\r", " ", $str); + $str = str_replace("\n", " ", $str); + + // set the length of content since we have changed it. + $this->size = strlen($str); + } + + $this->doc = $str; + $this->pos = 0; + $this->cursor = 1; + $this->noise = array(); + $this->nodes = array(); + $this->lowercase = $lowercase; + $this->default_br_text = $defaultBRText; + $this->default_span_text = $defaultSpanText; + $this->root = new simple_html_dom_node($this); + $this->root->tag = 'root'; + $this->root->_[HDOM_INFO_BEGIN] = -1; + $this->root->nodetype = HDOM_TYPE_ROOT; + $this->parent = $this->root; + if ($this->size>0) $this->char = $this->doc[0]; + } + + // parse html content + protected function parse() + { + if (($s = $this->copy_until_char('<'))==='') + { + return $this->read_tag(); + } + + // text + $node = new simple_html_dom_node($this); + ++$this->cursor; + $node->_[HDOM_INFO_TEXT] = $s; + $this->link_nodes($node, false); + return true; + } + + // PAPERG - dkchou - added this to try to identify the character set of the page we have just parsed so we know better how to spit it out later. + // NOTE: IF you provide a routine called get_last_retrieve_url_contents_content_type which returns the CURLINFO_CONTENT_TYPE from the last curl_exec + // (or the content_type header from the last transfer), we will parse THAT, and if a charset is specified, we will use it over any other mechanism. + protected function parse_charset() + { + global $debug_object; + + $charset = null; + + if (function_exists('get_last_retrieve_url_contents_content_type')) + { + $contentTypeHeader = get_last_retrieve_url_contents_content_type(); + $success = preg_match('/charset=(.+)/', $contentTypeHeader, $matches); + if ($success) + { + $charset = $matches[1]; + if (is_object($debug_object)) {$debug_object->debug_log(2, 'header content-type found charset of: ' . $charset);} + } + + } + + if (empty($charset)) + { + $el = $this->root->find('meta[http-equiv=Content-Type]',0, true); + if (!empty($el)) + { + $fullvalue = $el->content; + if (is_object($debug_object)) {$debug_object->debug_log(2, 'meta content-type tag found' . $fullvalue);} + + if (!empty($fullvalue)) + { + $success = preg_match('/charset=(.+)/i', $fullvalue, $matches); + if ($success) + { + $charset = $matches[1]; + } + else + { + // If there is a meta tag, and they don't specify the character set, research says that it's typically ISO-8859-1 + if (is_object($debug_object)) {$debug_object->debug_log(2, 'meta content-type tag couldn\'t be parsed. using iso-8859 default.');} + $charset = 'ISO-8859-1'; + } + } + } + } + + // If we couldn't find a charset above, then lets try to detect one based on the text we got... + if (empty($charset)) + { + // Use this in case mb_detect_charset isn't installed/loaded on this machine. + $charset = false; + if (function_exists('mb_detect_encoding')) + { + // Have php try to detect the encoding from the text given to us. + $charset = mb_detect_encoding($this->root->plaintext . "ascii", $encoding_list = array( "UTF-8", "CP1252" ) ); + if (is_object($debug_object)) {$debug_object->debug_log(2, 'mb_detect found: ' . $charset);} + } + + // and if this doesn't work... then we need to just wrongheadedly assume it's UTF-8 so that we can move on - cause this will usually give us most of what we need... + if ($charset === false) + { + if (is_object($debug_object)) {$debug_object->debug_log(2, 'since mb_detect failed - using default of utf-8');} + $charset = 'UTF-8'; + } + } + + // Since CP1252 is a superset, if we get one of it's subsets, we want it instead. + if ((strtolower($charset) == strtolower('ISO-8859-1')) || (strtolower($charset) == strtolower('Latin1')) || (strtolower($charset) == strtolower('Latin-1'))) + { + if (is_object($debug_object)) {$debug_object->debug_log(2, 'replacing ' . $charset . ' with CP1252 as its a superset');} + $charset = 'CP1252'; + } + + if (is_object($debug_object)) {$debug_object->debug_log(1, 'EXIT - ' . $charset);} + + return $this->_charset = $charset; + } + + // read tag info + protected function read_tag() + { + if ($this->char!=='<') + { + $this->root->_[HDOM_INFO_END] = $this->cursor; + return false; + } + $begin_tag_pos = $this->pos; + $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next + + // end tag + if ($this->char==='/') + { + $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next + // This represents the change in the simple_html_dom trunk from revision 180 to 181. + // $this->skip($this->token_blank_t); + $this->skip($this->token_blank); + $tag = $this->copy_until_char('>'); + + // skip attributes in end tag + if (($pos = strpos($tag, ' '))!==false) + $tag = substr($tag, 0, $pos); + + $parent_lower = strtolower($this->parent->tag); + $tag_lower = strtolower($tag); + + if ($parent_lower!==$tag_lower) + { + if (isset($this->optional_closing_tags[$parent_lower]) && isset($this->block_tags[$tag_lower])) + { + $this->parent->_[HDOM_INFO_END] = 0; + $org_parent = $this->parent; + + while (($this->parent->parent) && strtolower($this->parent->tag)!==$tag_lower) + $this->parent = $this->parent->parent; + + if (strtolower($this->parent->tag)!==$tag_lower) { + $this->parent = $org_parent; // restore origonal parent + if ($this->parent->parent) $this->parent = $this->parent->parent; + $this->parent->_[HDOM_INFO_END] = $this->cursor; + return $this->as_text_node($tag); + } + } + else if (($this->parent->parent) && isset($this->block_tags[$tag_lower])) + { + $this->parent->_[HDOM_INFO_END] = 0; + $org_parent = $this->parent; + + while (($this->parent->parent) && strtolower($this->parent->tag)!==$tag_lower) + $this->parent = $this->parent->parent; + + if (strtolower($this->parent->tag)!==$tag_lower) + { + $this->parent = $org_parent; // restore origonal parent + $this->parent->_[HDOM_INFO_END] = $this->cursor; + return $this->as_text_node($tag); + } + } + else if (($this->parent->parent) && strtolower($this->parent->parent->tag)===$tag_lower) + { + $this->parent->_[HDOM_INFO_END] = 0; + $this->parent = $this->parent->parent; + } + else + return $this->as_text_node($tag); + } + + $this->parent->_[HDOM_INFO_END] = $this->cursor; + if ($this->parent->parent) $this->parent = $this->parent->parent; + + $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next + return true; + } + + $node = new simple_html_dom_node($this); + $node->_[HDOM_INFO_BEGIN] = $this->cursor; + ++$this->cursor; + $tag = $this->copy_until($this->token_slash); + $node->tag_start = $begin_tag_pos; + + // doctype, cdata & comments... + if (isset($tag[0]) && $tag[0]==='!') { + $node->_[HDOM_INFO_TEXT] = '<' . $tag . $this->copy_until_char('>'); + + if (isset($tag[2]) && $tag[1]==='-' && $tag[2]==='-') { + $node->nodetype = HDOM_TYPE_COMMENT; + $node->tag = 'comment'; + } else { + $node->nodetype = HDOM_TYPE_UNKNOWN; + $node->tag = 'unknown'; + } + if ($this->char==='>') $node->_[HDOM_INFO_TEXT].='>'; + $this->link_nodes($node, true); + $this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next + return true; + } + + // text + if ($pos=strpos($tag, '<')!==false) { + $tag = '<' . substr($tag, 0, -1); + $node->_[HDOM_INFO_TEXT] = $tag; + $this->link_nodes($node, false); + $this->char = $this->doc[--$this->pos]; // prev + return true; + } + + if (!preg_match("/^[\w-:]+$/", $tag)) { + $node->_[HDOM_INFO_TEXT] = '<' . $tag . $this->copy_until('<>'); + if ($this->char==='<') { + $this->link_nodes($node, false); + return true; + } + + if ($this->char==='>') $node->_[HDOM_INF... [truncated message content] |
From: <wis...@us...> - 2015-12-07 13:02:19
|
Revision: 13176 http://sourceforge.net/p/xoops/svn/13176 Author: wishcraft Date: 2015-12-07 13:02:17 +0000 (Mon, 07 Dec 2015) Log Message: ----------- PingTrax Pre-alpha :: More done\!\!\! Modified Paths: -------------- XoopsModules/pingtrax/trunk/class/items.php XoopsModules/pingtrax/trunk/class/pings.php XoopsModules/pingtrax/trunk/class/sitemaps.php XoopsModules/pingtrax/trunk/class/trackback.php XoopsModules/pingtrax/trunk/language/english/modinfo.php XoopsModules/pingtrax/trunk/preloads/ping.php XoopsModules/pingtrax/trunk/preloads/sitemap.php XoopsModules/pingtrax/trunk/preloads/trackback.php XoopsModules/pingtrax/trunk/sql/mysql.sql XoopsModules/pingtrax/trunk/sql/tables.json XoopsModules/pingtrax/trunk/xoops_version.php Added Paths: ----------- XoopsModules/pingtrax/trunk/api/.htaccess XoopsModules/pingtrax/trunk/api/index.php Added: XoopsModules/pingtrax/trunk/api/.htaccess =================================================================== --- XoopsModules/pingtrax/trunk/api/.htaccess (rev 0) +++ XoopsModules/pingtrax/trunk/api/.htaccess 2015-12-07 13:02:17 UTC (rev 13176) @@ -0,0 +1,2 @@ +RewriteEngine On +RewriteRule ^([0-9a-z]{32})$ index.php?referer=$1 [L] \ No newline at end of file Added: XoopsModules/pingtrax/trunk/api/index.php =================================================================== --- XoopsModules/pingtrax/trunk/api/index.php (rev 0) +++ XoopsModules/pingtrax/trunk/api/index.php 2015-12-07 13:02:17 UTC (rev 13176) @@ -0,0 +1 @@ +<?php Modified: XoopsModules/pingtrax/trunk/class/items.php =================================================================== --- XoopsModules/pingtrax/trunk/class/items.php 2015-12-07 11:07:26 UTC (rev 13175) +++ XoopsModules/pingtrax/trunk/class/items.php 2015-12-07 13:02:17 UTC (rev 13176) @@ -61,11 +61,21 @@ */ class PingtraxItems extends XoopsObject { + /** + * + * @var unknown + */ + var $_configs = array(); + /** * */ function __construct() { + $moduleHandler = xoops_gethandler('module'); + $configHandler = xoops_gethandler('config'); + $this->_configs = $configHandler->getConfigList($moduleHandler->getByDirname(basename(dirname(__DIR__)))->getVar('mid')); + $this->XoopsObject(); $this->initVar('id', XOBJ_DTYPE_INT, null, false); $this->initVar('referer', XOBJ_DTYPE_OTHER, sha1(NULL), false, 44); @@ -83,9 +93,9 @@ $this->initVar('item-domain', XOBJ_DTYPE_TXTBOX, parse_url(XOOPS_URL, PHP_URL_HOST), true, 150); $this->initVar('item-referer-uri', XOBJ_DTYPE_TXTBOX, $_SERVER["REQUEST_URI"], true, 250); $this->initVar('item-php-self', XOBJ_DTYPE_TXTBOX, str_replace(XOOPS_ROOT_PATH, "", $_SERVER["PHP_SELF"]), true, 250); - $this->initVar('feed-protocol', XOBJ_DTYPE_ENUM, XOOPS_PROT, true, false, false, false, array('https://','http://')); - $this->initVar('feed-domain', XOBJ_DTYPE_TXTBOX, parse_url(XOOPS_URL, PHP_URL_HOST), true, 150); - $this->initVar('feed-referer-uri', XOBJ_DTYPE_TXTBOX, parse_url(XOOPS_URL, PHP_URL_PATH) . '/backend.php', true, 250); + $this->initVar('feed-protocol', XOBJ_DTYPE_ENUM, parse_url(str_replace("%xoops_url%", XOOPS_URL, $this->_configs['default_feed_url']), PHP_URL_SCHEME), true, false, false, false, array('https://','http://')); + $this->initVar('feed-domain', XOBJ_DTYPE_TXTBOX, parse_url(str_replace("%xoops_url%", XOOPS_URL, $this->_configs['default_feed_url']), PHP_URL_HOST), true, 150); + $this->initVar('feed-referer-uri', XOBJ_DTYPE_TXTBOX, parse_url(str_replace("%xoops_url%", XOOPS_URL, $this->_configs['default_feed_url']), PHP_URL_PATH) . '/backend.php', true, 250); $this->initVar('discovery-hook', XOBJ_DTYPE_ENUM, 'unknown', true, false, false, false, array('php','preloader','smarty','combination','unknown')); $this->initVar('user-session', XOBJ_DTYPE_ENUM, 'unknown', true, false, false, false, array('admin','user','guest','unknown')); $this->initVar('created', XOBJ_DTYPE_INT, 0, false); @@ -93,6 +103,32 @@ $this->initVar('offline', XOBJ_DTYPE_INT, 0, false); } + /** + * + * @return string + */ + function getPingXML() + { + $xml = "<?xml version=\"1.0\"?>\n"; + $xml .= "<methodCall>\n"; + $xml .= "\t<methodName>weblogUpdates.extendedPing</methodName>\n"; + $xml .= "\t<params>\n"; + $xml .= "\t\t<param>\n"; + $xml .= "\t\t\t<value>".$this->getVar('item-title')."</value>\n"; + $xml .= "\t\t</param>\n"; + $xml .= "\t\t<param>\n"; + $xml .= "\t\t\t<value>".$this->getVar('item-protocol').$this->getVar('item-domain')."</value>\n"; + $xml .= "\t\t</param>\n"; + $xml .= "\t\t<param>\n"; + $xml .= "\t\t\t<value>".$this->getVar('item-protocol').$this->getVar('item-domain').$this->getVar('item-referer-uri')."</value>\n"; + $xml .= "\t\t</param>\n"; + $xml .= "\t\t<param>\n"; + $xml .= "\t\t\t<value>".$this->getVar('feed-protocol').$this->getVar('feed-domain').$this->getVar('feed-referer-uri')."</value>\n"; + $xml .= "\t\t</param>\n"; + $xml .= "\t</params>\n"; + $xml .= "</methodCall>"; + return $xml; + } } /** @@ -125,29 +161,43 @@ else return false; } - $sitemapsHandler = xoops_getmodulehandler('sitemaps', 'pingtrax'); - $criteria = new CriteriaCompo(new Criteria('protocol', XOOPS_PROT)); - $criteria->add(new Criteria('domain', parse_url(XOOPS_URL, PHP_URL_HOST))); - $criteria->add(new Criteria('baseurl', parse_url(XOOPS_URL, PHP_URL_PATH))); - if ($sitemapsHandler->getCount($criteria)==0) + if ($object->getVar('type') == 'local') { - $sitemap = $sitemapsHandler->create(); - $sitemap->setVar('referer', md5(XOOPS_URL.microtime(true).XOOPS_DB_USER.XOOPS_DB_PASS)); - $sitemap->setVar('protocol', XOOPS_PROT); - $sitemap->setVar('domain', parse_url(XOOPS_URL, PHP_URL_HOST)); - $sitemap->setVar('baseurl', parse_url(XOOPS_URL, PHP_URL_PATH)); - $sitemap->setVar('filename', 'sitemap.'.str_replace("://", "", XOOPS_PROT) . "." . parse_url(XOOPS_URL, PHP_URL_HOST) . '.xml'); - $sitemap = $sitemapsHandler->get($sitemap = $sitemapsHandler->insert($sitemap, true)); - } else { - $obj = $sitemapsHandler->getObjects($criteria, false); - if (is_object($obj[0])) - $sitemap = $obj[0]; + $sitemapsHandler = xoops_getmodulehandler('sitemaps', 'pingtrax'); + $criteria = new CriteriaCompo(new Criteria('protocol', XOOPS_PROT)); + $criteria->add(new Criteria('domain', parse_url(XOOPS_URL, PHP_URL_HOST))); + $criteria->add(new Criteria('baseurl', parse_url(XOOPS_URL, PHP_URL_PATH))); + if ($sitemapsHandler->getCount($criteria)==0) + { + $sitemap = $sitemapsHandler->create(); + $sitemap->setVar('referer', md5(XOOPS_URL.microtime(true).XOOPS_DB_USER.XOOPS_DB_PASS)); + $sitemap->setVar('protocol', XOOPS_PROT); + $sitemap->setVar('domain', parse_url(XOOPS_URL, PHP_URL_HOST)); + $sitemap->setVar('baseurl', parse_url(XOOPS_URL, PHP_URL_PATH)); + $sitemap->setVar('filename', 'sitemap.'.str_replace("://", "", XOOPS_PROT) . "." . parse_url(XOOPS_URL, PHP_URL_HOST) . '.xml'); + $sitemap = $sitemapsHandler->get($sitemap = $sitemapsHandler->insert($sitemap, true)); + } else { + $obj = $sitemapsHandler->getObjects($criteria, false); + if (is_object($obj[0])) + $sitemap = $obj[0]; + } + $items_sitemapsHandler = xoops_getmodulehandler('items_sitemaps', 'pingtrax'); + $itemsitemap = $items_sitemapsHandler->create(); + $itemsitemap->setVar('map-referer', $sitemap->getVar('referer')); + $itemsitemap->setVar('item-referer', $object->getVar('referer')); + $items_sitemapsHandler->insert($itemsitemap, true); + $items_pingsHandler = xoops_getmodulehandler('items_pings', 'pingtrax'); + $pingsHandler = xoops_getmodulehandler('pings', 'pingtrax'); + $criteria = new CriteriaCompo(new Criteria('type', 'XML-RPC')); + $criteria->add(new Criteria('offline', 0)); + foreach($pingsHandler->getObjects($criteria, true) as $id => $ping) + { + $itemping = $items_pingsHandler->create(); + $itemping->setVar('ping-referer', $ping->getVar('referer')); + $itemping->setVar('item-referer', $object->getVar('referer')); + $items_pingsHandler->insert($itemping, true); + } } - $items_sitemapsHandler = xoops_getmodulehandler('items_sitemaps', 'pingtrax'); - $itemsitemap = $items_sitemapsHandler->create(); - $itemsitemap->setVar('map-referer', $sitemap->getVar('referer')); - $itemsitemap->setVar('item-referer', $object->getVar('referer')); - $items_sitemapsHandler->insert($itemsitemap, true); } else { $object->setVar('updated', time()); } Modified: XoopsModules/pingtrax/trunk/class/pings.php =================================================================== --- XoopsModules/pingtrax/trunk/class/pings.php 2015-12-07 11:07:26 UTC (rev 13175) +++ XoopsModules/pingtrax/trunk/class/pings.php 2015-12-07 13:02:17 UTC (rev 13176) @@ -71,6 +71,32 @@ $this->initVar('offline', XOBJ_DTYPE_INT, 0, false); } + /** + * + * @param PingtraxItems $item + * @return mixed + */ + function getPingURL(PingtraxItems $item) + { + $uri = $this->getVar('uri'); + $uri = str_replace(urlencode($item->getVar('item-title')), '%title', $uri); + $uri = str_replace(urlencode($item->getVar('item-decription')), '%description', $uri); + $uri = str_replace(urlencode($item->getVar('item-protocol').$item->getVar('item-domain').$item->getVar('item-referer-uri')), '%url', $uri); + $uri = str_replace(urlencode($item->getVar('feed-protocol').$item->getVar('feed-domain').$item->getVar('feed-referer-uri')), '%feed', $uri); + return $uri; + } + /** + * + * @param PingtraxItems $item + * @return mixed + */ + function getSitemapURL(PingtraxSitemaps $sitemap) + { + $uri = $this->getVar('uri'); + $uri = str_replace(urlencode($sitemap->getVar('protocol').$sitemap->getVar('domain').(strlen($sitemap->getVar('baseurl'))>1?((substr($sitemap->getVar('baseurl'),0,1)!="/"?"/":"").$sitemap->getVar('baseurl').(substr($sitemap->getVar('baseurl'),strlen($sitemap->getVar('baseurl'))-1,1)!="/"?"/":"")):"/")).$sitemap->getVar('filename'), '%url', $uri); + return $uri; + } + } /** @@ -78,8 +104,13 @@ */ class PingtraxPingsHandler extends XoopsPersistableObjectHandler { - /** + * + * @var unknown + */ + var $_configs = array(); + + /** * var string URL of JSON Resource for Install */ var $_resource = "https://sourceforge.net/p/xoops/svn/HEAD/tree/XoopsModules/pingtrax/data/ping-resources.json?format=raw"; @@ -89,6 +120,10 @@ */ function __construct(&$db) { + $moduleHandler = xoops_gethandler('module'); + $configHandler = xoops_gethandler('config'); + $this->_configs = $configHandler->getConfigList($moduleHandler->getByDirname(basename(dirname(__DIR__)))->getVar('mid')); + parent::__construct($db, "pingtrax_pings", 'PingtraxPings', 'id', 'referer'); $criteria = new Criteria('id',0,"<>"); @@ -117,5 +152,101 @@ return parent::insert($object, $force); } - + + function makePings($referer = '') + { + $this->addTimeLimit(120); + $items_pingsHandler = xoops_getmodulehandler('items_pings', 'pingtrax'); + $itemsHandler = xoops_getmodulehandler('items', 'pingtrax'); + $criteria = new CriteriaCompo(new Criteria('offline', 0)); + if (!empty($referer)) + $criteria->add(new Criteria('referer', $referer)); + $sleepcriteria = new CriteriaCompo(new Criteria('sleep-till', 0), 'OR'); + $sleepcriteria->add(new Criteria('sleep-till', time(), "<="), 'OR'); + $criteria->add($sleepcriteria, 'AND'); + $criteria->add(new Criteria('type', 'XML-RPC'), 'AND'); + foreach($this->getObjects($criteria, true) as $id => $ping) + { + $start = microtime(true); + $criteria = new CriteriaCompo(new Criteria('when', 0)); + $criteria->add(new Criteria('ping-referer', $ping->getVar('referer'))); + foreach($items_pingsHandler->getObjects($criteria, true) as $piid => $itemping) + { + $item = $itemsHandler->getByReferer($itemping->getVar('item-referer')); + if (is_a($item, "PingtraxItems")) + { + $context = stream_context_create(array('http' => array( + 'method' => "POST", + 'header' => "Content-Type: text/xml\r\n", + 'content' => $item->getPingXML() + ))); + $file = @file_get_contents($ping->getPingURL($item), false, $context); + if ($file === false) { + $ping->setVar('failed-pings', $this->getVar('failed-pings') + 1); + $ping->setVar('failure-time', time()); + } + elseif ($file) { + $ping->setVar('successful-pings', $this->getVar('successful-pings') + 1); + $ping->setVar('success-time', time()); + $itemping->setVar('when', time()); + $items_pingsHandler->insert($itemping, true); + } + + } + } + switch($this->_config['pings_sleep_till']) + { + case 0: + $ping->setVar('sleep-till', time() + mt_rand(600, 3600*24)); + break; + default: + $ping->setVar('sleep-till', time() + $this->_config['pings_sleep_till']); + break; + } + $this->insert($ping, true); + } + } + + + function sendSitemap(PingtraxSitemaps $sitemap) + { + $this->addTimeLimit(120); + $items_pingsHandler = xoops_getmodulehandler('items_pings', 'pingtrax'); + $itemsHandler = xoops_getmodulehandler('items', 'pingtrax'); + $criteria = new CriteriaCompo(new Criteria('offline', 0)); + if (!empty($referer)) + $criteria->add(new Criteria('referer', $referer)); + $sleepcriteria = new CriteriaCompo(new Criteria('sleep-till', 0), 'OR'); + $sleepcriteria->add(new Criteria('sleep-till', time(), "<="), 'OR'); + $criteria->add($sleepcriteria, 'AND'); + $criteria->add(new Criteria('type', 'SITEMAPS'), 'AND'); + foreach($this->getObjects($criteria, true) as $id => $ping) + { + $start = microtime(true); + if (is_a($sitemap, "PingtraxSitemaps")) + { + $file = @file_get_contents($ping->getSitemapURL($sitemap), false); + if ($file === false) { + $ping->setVar('failed-pings', $this->getVar('failed-pings') + 1); + $ping->setVar('failure-time', time()); + } + elseif ($file) { + $ping->setVar('successful-pings', $this->getVar('successful-pings') + 1); + $ping->setVar('success-time', time()); + $itemping->setVar('when', time()); + $items_pingsHandler->insert($itemping, true); + } + } + switch($this->_config['pings_sleep_till']) + { + case 0: + $ping->setVar('sleep-till', time() + mt_rand(600, 3600*24)); + break; + default: + $ping->setVar('sleep-till', time() + $this->_config['pings_sleep_till']); + break; + } + $this->insert($ping, true); + } + } } Modified: XoopsModules/pingtrax/trunk/class/sitemaps.php =================================================================== --- XoopsModules/pingtrax/trunk/class/sitemaps.php 2015-12-07 11:07:26 UTC (rev 13175) +++ XoopsModules/pingtrax/trunk/class/sitemaps.php 2015-12-07 13:02:17 UTC (rev 13176) @@ -86,12 +86,21 @@ */ class PingtraxSitemapsHandler extends XoopsPersistableObjectHandler { - + /** + * + * @var unknown + */ + var $_configs = array(); + /** * @param null|object $db */ function __construct(&$db) { + $moduleHandler = xoops_gethandler('module'); + $configHandler = xoops_gethandler('config'); + $this->_configs = $configHandler->getConfigList($moduleHandler->getByDirname(basename(dirname(__DIR__)))->getVar('mid')); + parent::__construct($db, "pingtrax_sitemaps", 'PingtraxSitemaps', 'id', 'referer'); } @@ -122,6 +131,7 @@ { $this->addTimeLimit(120); $items_sitemapsHandler = xoops_getmodulehandler('items_sitemaps', 'pingtrax'); + $pingsHandler = xoops_getmodulehandler('pings', 'pingtrax'); $itemsHandler = xoops_getmodulehandler('items', 'pingtrax'); $criteria = new CriteriaCompo(new Criteria('offline', 0)); if (!empty($referer)) @@ -185,10 +195,18 @@ file_put_contents($flout, implode(PHP_EOL, $data)); } } - } - $sitemap->setVar('sleep-till', time() + (3600*18)); + switch($this->_config['sitemaps_sleep_till']) + { + case 0: + $sitemap->setVar('sleep-till', time() + mt_rand(600, 3600*24)); + break; + default: + $sitemap->setVar('sleep-till', time() + $this->_config['sitemaps_sleep_till']); + break; + } $this->insert($sitemap, true); + $pingsHandler->sendSitemap($sitemap); $this->addTimeLimit(microtime(true)-$start+10); } } Modified: XoopsModules/pingtrax/trunk/class/trackback.php =================================================================== --- XoopsModules/pingtrax/trunk/class/trackback.php 2015-12-07 11:07:26 UTC (rev 13175) +++ XoopsModules/pingtrax/trunk/class/trackback.php 2015-12-07 13:02:17 UTC (rev 13176) @@ -243,23 +243,23 @@ if ($success) { // PingtraxTrackback retreived successfully... // Sending back an RSS (0.91) - trackback information from $response (array)... - $return .= " <error>0</error> \n"; - $return .= " <rss version=\"0.91\"> \n"; - $return .= " <channel> \n"; - $return .= " <title>" . $this->xml_safe($response['title']) . "</title> \n"; - $return .= " <link>" . $this->xml_safe($response['trackback']) . "</link> \n"; - $return .= " <description>" . $this->xml_safe($response['expert']) . "</description> \n"; - $return .= " <item> \n"; - $return .= " <title>" . $this->xml_safe($response['title']) . "</title> \n"; - $return .= " <link>" . $this->xml_safe($response['permalink']) . "</link> \n"; - $return .= " <description>" . $this->xml_safe($response['expert']) . "</description> \n"; - $return .= " </item> \n"; - $return .= " </channel> \n"; - $return .= " </rss> \n"; + $return .= "\t<error>0</error> \n"; + $return .= "\t<rss version=\"0.91\"> \n"; + $return .= "\t<channel> \n"; + $return .= "\t\t<title>" . $this->xml_safe($response['title']) . "</title> \n"; + $return .= "\t\t<link>" . $this->xml_safe($response['trackback']) . "</link> \n"; + $return .= "\t\t<description>" . $this->xml_safe($response['expert']) . "</description> \n"; + $return .= "\t\t<item> \n"; + $return .= "\t\t\t<title>" . $this->xml_safe($response['title']) . "</title> \n"; + $return .= "\t\t\t<link>" . $this->xml_safe($response['permalink']) . "</link> \n"; + $return .= "\t\t\t<description>" . $this->xml_safe($response['expert']) . "</description> \n"; + $return .= "\t\t</item> \n"; + $return .= "\t</channel> \n"; + $return .= "\t</rss> \n"; } else { // Something went wrong - provide reason from $response (string)... - $return .= " <error>1</error> \n"; - $return .= " <message>" . $this->xml_safe($response) . "</message>\n"; + $return .= "\t<error>1</error> \n"; + $return .= "\t<message>" . $this->xml_safe($response) . "</message>\n"; } // End response to trackbacker $return .= "</response>"; @@ -296,17 +296,17 @@ $return = "<!-- \n"; $return .= "<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" \n"; - $return .= " xmlns:dc=\"http://purl.org/dc/elements/1.1/\" \n"; - $return .= " xmlns:trackback=\"http://madskills.com/public/xml/rss/module/trackback/\"> \n"; + $return .= "\txmlns:dc=\"http://purl.org/dc/elements/1.1/\" \n"; + $return .= "\txmlns:trackback=\"http://madskills.com/public/xml/rss/module/trackback/\"> \n"; $return .= "<rdf:Description \n"; - $return .= " rdf:about=\"" . $this->xml_safe($permalink) . "\" \n"; - $return .= " dc:identifier=\"" . $this->xml_safe($permalink) . "\" \n"; - $return .= " trackback:ping=\"" . $this->xml_safe($trackback) . "\" \n"; - $return .= " dc:title=\"" . $this->xml_safe($title) . "\" \n"; - $return .= " dc:subject=\"TrackBack\" \n"; - $return .= " dc:description=\"" . $this->xml_safe($this->cut_short($expert)) . "\" \n"; - $return .= " dc:creator=\"" . $this->xml_safe($author) . "\" \n"; - $return .= " dc:date=\"" . $RFC822_date . "\" /> \n"; + $return .= "\trdf:about=\"" . $this->xml_safe($permalink) . "\" \n"; + $return .= "\tdc:identifier=\"" . $this->xml_safe($permalink) . "\" \n"; + $return .= "\ttrackback:ping=\"" . $this->xml_safe($trackback) . "\" \n"; + $return .= "\tdc:title=\"" . $this->xml_safe($title) . "\" \n"; + $return .= "\tdc:subject=\"TrackBack\" \n"; + $return .= "\tdc:description=\"" . $this->xml_safe($this->cut_short($expert)) . "\" \n"; + $return .= "\tdc:creator=\"" . $this->xml_safe($author) . "\" \n"; + $return .= "\tdc:date=\"" . $RFC822_date . "\" /> \n"; $return .= "</rdf:RDF> \n"; $return .= "--> \n"; Modified: XoopsModules/pingtrax/trunk/language/english/modinfo.php =================================================================== --- XoopsModules/pingtrax/trunk/language/english/modinfo.php 2015-12-07 11:07:26 UTC (rev 13175) +++ XoopsModules/pingtrax/trunk/language/english/modinfo.php 2015-12-07 13:02:17 UTC (rev 13176) @@ -24,4 +24,26 @@ define('_MI_PINGTRAX_DESC',"Module for Automated PingList's and Trackbacks as well as sitemaps in XML!"); define('_MI_PINGTRAX_DEFAULT_FEED_URL',"Default URL for the RSS Feed Backend"); define('_MI_PINGTRAX_DEFAULT_FEED_URL_DESC',"This will provide the default URL for the feed, <em>%xoops_url%</em> will be replaced with <em>".XOOPS_URL."</em>"); - +define('_MI_PINGTRAX_PINGS_SLEEP_TILL', 'Ping Sleeps for this period until next batch'); +define('_MI_PINGTRAX_PINGS_SLEEP_TILL_DESC', 'This is how long a ping will sleep for until called in a batch with the footer preloader!'); +define('_MI_PINGTRAX_SITEMAPS_SLEEP_TILL', 'Sitemap re-write will sleep for this period!'); +define('_MI_PINGTRAX_SITEMAPS_SLEEP_TILL_DESC', 'This is how long a sitemap re-write will sleep for until called in a batch with the footer preloader!'); +define('_MI_PINGTRAX_TIME_RANDOM', 'Random (15m ~ 24Hrs)'); +define('_MI_PINGTRAX_TIME_15M', '15 Minutes'); +define('_MI_PINGTRAX_TIME_30M', '30 Minutes'); +define('_MI_PINGTRAX_TIME_1HR', '1 Hour'); +define('_MI_PINGTRAX_TIME_2HR', '2 Hours'); +define('_MI_PINGTRAX_TIME_3HR', '3 Hours'); +define('_MI_PINGTRAX_TIME_4HR', '4 Hours'); +define('_MI_PINGTRAX_TIME_5HR', '5 Hours'); +define('_MI_PINGTRAX_TIME_6HR', '6 Hours'); +define('_MI_PINGTRAX_TIME_7HR', '7 Hours'); +define('_MI_PINGTRAX_TIME_8HR', '8 Hours'); +define('_MI_PINGTRAX_TIME_9HR', '9 Hours'); +define('_MI_PINGTRAX_TIME_10HR', '10 Hours'); +define('_MI_PINGTRAX_TIME_11HR', '11 Hours'); +define('_MI_PINGTRAX_TIME_12HR', '12 Hours'); +define('_MI_PINGTRAX_TIME_14HR', '14 Hours'); +define('_MI_PINGTRAX_TIME_16HR', '16 Hours'); +define('_MI_PINGTRAX_TIME_24HR', '24 Hours'); + \ No newline at end of file Modified: XoopsModules/pingtrax/trunk/preloads/ping.php =================================================================== --- XoopsModules/pingtrax/trunk/preloads/ping.php 2015-12-07 11:07:26 UTC (rev 13175) +++ XoopsModules/pingtrax/trunk/preloads/ping.php 2015-12-07 13:02:17 UTC (rev 13176) @@ -27,45 +27,14 @@ */ class PingtraxPingPreload extends XoopsPreloadItem { + /** * @param $args - - function eventCoreIncludeFunctionsRedirectheader($args) + */ + function eventCoreFooterEnd($args) { - $context = stream_context_create(array('http' => array( - 'method' => "POST", - 'header' => "Content-Type: text/xml\r\n", - 'content' => $xml - ))); - $file = @file_get_contents($post_to, false, $context); - if ($file === false) { echo '<p>Couldn\'t connect!</p>'; } - elseif ($file) { - echo '<p>The following response was returned:</p>'; - echo '<pre>'.htmlspecialchars($file).'</pre>'; - } else { - echo '<p>Empty response!</p>'; - } + $pingsHandler = xoops_getmodulehandler('pings', 'pingtrax'); + $pingsHanlder->makePings(''); } - - -1. <?xml version="1.0"?> -2. <methodCall> -3. <methodName>weblogUpdates.extendedPing</methodName> -4. <params> -5. <param> -6. <value>Example Blog</value> -7. </param> -8. <param> -9. <value>http://www.example.com/blog/</value> -10. </param> -11. <param> -12. <value>http://www.example.com/blog/new-post.html</value> -13. </param> -14. <param> -15. <value>http://www.example.com/blog/feed.xml</value> -16. </param> -17. </params> -18. </methodCall> - */ } Modified: XoopsModules/pingtrax/trunk/preloads/sitemap.php =================================================================== --- XoopsModules/pingtrax/trunk/preloads/sitemap.php 2015-12-07 11:07:26 UTC (rev 13175) +++ XoopsModules/pingtrax/trunk/preloads/sitemap.php 2015-12-07 13:02:17 UTC (rev 13176) @@ -29,23 +29,11 @@ { /** * @param $args - - function eventCoreIncludeFunctionsRedirectheader($args) + */ + function eventCoreFooterEnd($args) { - $context = stream_context_create(array('http' => array( - 'method' => "POST", - 'header' => "Content-Type: text/xml\r\n", - 'content' => $xml - ))); - $file = @file_get_contents($post_to, false, $context); - if ($file === false) { echo '<p>Couldn\'t connect!</p>'; } - elseif ($file) { - echo '<p>The following response was returned:</p>'; - echo '<pre>'.htmlspecialchars($file).'</pre>'; - } else { - echo '<p>Empty response!</p>'; - } + $sitemapsHandler = xoops_getmodulehandler('sitemaps', 'pingtrax'); + $sitemapsHanlder->writeSitemaps(''); } - */ } Modified: XoopsModules/pingtrax/trunk/preloads/trackback.php =================================================================== --- XoopsModules/pingtrax/trunk/preloads/trackback.php 2015-12-07 11:07:26 UTC (rev 13175) +++ XoopsModules/pingtrax/trunk/preloads/trackback.php 2015-12-07 13:02:17 UTC (rev 13176) @@ -22,30 +22,25 @@ defined('XOOPS_ROOT_PATH') || die('XOOPS root path not defined'); +require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'class' . DIRECTORY_SEPARATOR . 'trackback.php'; + /** * Class PingtraxTrackbackPreload */ class PingtraxTrackbackPreload extends XoopsPreloadItem { + /** * @param $args - - function eventCoreIncludeFunctionsRedirectheader($args) + */ + function eventCoreFooterEnd($args) { - $context = stream_context_create(array('http' => array( - 'method' => "POST", - 'header' => "Content-Type: text/xml\r\n", - 'content' => $xml - ))); - $file = @file_get_contents($post_to, false, $context); - if ($file === false) { echo '<p>Couldn\'t connect!</p>'; } - elseif ($file) { - echo '<p>The following response was returned:</p>'; - echo '<pre>'.htmlspecialchars($file).'</pre>'; - } else { - echo '<p>Empty response!</p>'; - } + global $pingtraxitem; + if (is_a($pingtraxitem, "PingtraxItems")) + { + $trackback = new PingtraxTrackback($pingtraxitem->getVar('item-title'), $pingtraxitem->getVar('item-author-name'), 'UTF-8'); + echo $trackback->rdf_autodiscover(RFC822_from_datetime($pingtraxitem->getVar('created')), $pingtraxitem->getVar('item-title'), $pingtraxitem->getVar('item-description'), $pingtraxitem->getVar('item-protocol').$pingtraxitem->getVar('item-domain').$pingtraxitem->getVar('item-referer-uri'), XOOPS_URL . '/modules/pingtrax/api/' . $pingtraxitem->getVar('referer'), $pingtraxitem->getVar('item-author-name')); + } } - */ } Modified: XoopsModules/pingtrax/trunk/sql/mysql.sql =================================================================== --- XoopsModules/pingtrax/trunk/sql/mysql.sql 2015-12-07 11:07:26 UTC (rev 13175) +++ XoopsModules/pingtrax/trunk/sql/mysql.sql 2015-12-07 13:02:17 UTC (rev 13176) @@ -108,16 +108,6 @@ KEY `CHRONOLOGISTICS` (`id`,`referer`,`created`,`updated`,`offlined`,`failure-time`,`success-time`,`sleep-till`) USING BTREE KEY_BLOCK_SIZE=128 ) ENGINE=InnoDB AUTO_INCREMENT=150 DEFAULT CHARSET=utf8 PACK_KEYS=1 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC KEY_BLOCK_SIZE=16; -CREATE TABLE `pingtrax_pings_sitemaps` ( - `id` mediumint(32) NOT NULL AUTO_INCREMENT, - `map-referer` varchar(44) NOT NULL DEFAULT '', - `ping-referer` varchar(44) NOT NULL DEFAULT '', - `when` int(12) NOT NULL DEFAULT '0', - PRIMARY KEY (`id`), - KEY `SEARCH` (`id`,`map-referer`,`ping-referer`) USING BTREE, - KEY `CHRONOLOGISTICS` (`map-referer`,`ping-referer`,`when`) USING BTREE KEY_BLOCK_SIZE=64 -) ENGINE=InnoDB DEFAULT CHARSET=utf8 PACK_KEYS=1 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC KEY_BLOCK_SIZE=8; - CREATE TABLE `pingtrax_sitemaps` ( `id` int(10) NOT NULL AUTO_INCREMENT, `referer` varchar(44) NOT NULL DEFAULT '', Modified: XoopsModules/pingtrax/trunk/sql/tables.json =================================================================== --- XoopsModules/pingtrax/trunk/sql/tables.json 2015-12-07 11:07:26 UTC (rev 13175) +++ XoopsModules/pingtrax/trunk/sql/tables.json 2015-12-07 13:02:17 UTC (rev 13176) @@ -1 +1 @@ -{"pingtrax_items","pingtrax_items_pings","pingtrax_items_sitemaps","pingtrax_pings","pingtrax_pings_sitemaps","pingtrax_sitemaps"} \ No newline at end of file +{"pingtrax_items","pingtrax_items_pings","pingtrax_items_sitemaps","pingtrax_pings","pingtrax_sitemaps"} \ No newline at end of file Modified: XoopsModules/pingtrax/trunk/xoops_version.php =================================================================== --- XoopsModules/pingtrax/trunk/xoops_version.php 2015-12-07 11:07:26 UTC (rev 13175) +++ XoopsModules/pingtrax/trunk/xoops_version.php 2015-12-07 13:02:17 UTC (rev 13176) @@ -88,3 +88,27 @@ 'default' => '%xoops_url%/backend.php' ); +$modversion['config'][] = array( + 'name' => 'pings_sleep_till', + 'title' => '_MI_PINGTRAX_PINGS_SLEEP_TILL', + 'description' => '_MI_PINGTRAX_PINGS_SLEEP_TILL_DESC', + 'formtype' => 'select', + 'valuetype' => 'int', + 'options' => array( 0 => _MI_PINGTRAX_TIME_RANDOM, 900 => _MI_PINGTRAX_TIME_15M, 1800 => _MI_PINGTRAX_TIME_30M, 3600 => _MI_PINGTRAX_TIME_1HR, (3600*2) => _MI_PINGTRAX_TIME_2HR, (3600*3) => _MI_PINGTRAX_TIME_3HR, + (3600*4) => _MI_PINGTRAX_TIME_4HR, (3600*5) => _MI_PINGTRAX_TIME_5HR, (3600*6) => _MI_PINGTRAX_TIME_6HR, (3600*7) => _MI_PINGTRAX_TIME_7HR, (3600*8) => _MI_PINGTRAX_TIME_8HR, (3600*9) => _MI_PINGTRAX_TIME_9HR, + (3600*10) => _MI_PINGTRAX_TIME_10HR, (3600*11) => _MI_PINGTRAX_TIME_11HR, (3600*12) => _MI_PINGTRAX_TIME_12HR, (3600*14) => _MI_PINGTRAX_TIME_14HR, (3600*16) => _MI_PINGTRAX_TIME_16HR, (3600*24) => _MI_PINGTRAX_TIME_24HR), + 'default' => 3600 * mt_rand(1,12) +); + +$modversion['config'][] = array( + 'name' => 'sitemaps_sleep_till', + 'title' => '_MI_PINGTRAX_SITEMAPS_SLEEP_TILL', + 'description' => '_MI_PINGTRAX_SITEMAPS_SLEEP_TILL_DESC', + 'formtype' => 'select', + 'valuetype' => 'int', + 'options' => array( 0 => _MI_PINGTRAX_TIME_RANDOM, 900 => _MI_PINGTRAX_TIME_15M, 1800 => _MI_PINGTRAX_TIME_30M, 3600 => _MI_PINGTRAX_TIME_1HR, (3600*2) => _MI_PINGTRAX_TIME_2HR, (3600*3) => _MI_PINGTRAX_TIME_3HR, + (3600*4) => _MI_PINGTRAX_TIME_4HR, (3600*5) => _MI_PINGTRAX_TIME_5HR, (3600*6) => _MI_PINGTRAX_TIME_6HR, (3600*7) => _MI_PINGTRAX_TIME_7HR, (3600*8) => _MI_PINGTRAX_TIME_8HR, (3600*9) => _MI_PINGTRAX_TIME_9HR, + (3600*10) => _MI_PINGTRAX_TIME_10HR, (3600*11) => _MI_PINGTRAX_TIME_11HR, (3600*12) => _MI_PINGTRAX_TIME_12HR, (3600*14) => _MI_PINGTRAX_TIME_14HR, (3600*16) => _MI_PINGTRAX_TIME_16HR, (3600*24) => _MI_PINGTRAX_TIME_24HR), + 'default' => 3600 * mt_rand(1,12) +); + |
From: <wis...@us...> - 2015-12-07 13:42:47
|
Revision: 13178 http://sourceforge.net/p/xoops/svn/13178 Author: wishcraft Date: 2015-12-07 13:42:44 +0000 (Mon, 07 Dec 2015) Log Message: ----------- PingTrax Pre-alpha :: More done\!\!\! Modified Paths: -------------- XoopsModules/pingtrax/trunk/api/index.php XoopsModules/pingtrax/trunk/class/items.php XoopsModules/pingtrax/trunk/class/plugins.php XoopsModules/pingtrax/trunk/sql/mysql.sql Modified: XoopsModules/pingtrax/trunk/api/index.php =================================================================== --- XoopsModules/pingtrax/trunk/api/index.php 2015-12-07 13:02:52 UTC (rev 13177) +++ XoopsModules/pingtrax/trunk/api/index.php 2015-12-07 13:42:44 UTC (rev 13178) @@ -1 +1,50 @@ <?php + +require_once dirname(dirname(dirname(__DIR__))) . DIRECTORY_SEPARATOR . "mainfile.php"; +require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . "class". DIRECTORY_SEPARATOR . "trackback.php"; + +$trackback = new PingtraxTrackback($GLOBALS['xoopsConfig']['sitename'], $GLOBALS['xoopsConfig']['sitename'], 'UTF-8'); + +if (!isset($_GET['referer'])) + die($trackback->recieve(false, "\$_GET['referer'] not specified and is required for trackback API!")); + +xoops_load("XoopsUserUtility"); +$moduleHandler = xoops_gethandler('module'); +$commentHandler = xoops_gethandler('comment'); +$itemsHandler = xoops_getmodulehandler('items', 'pingtrax'); +$item = $itemsHandler->getByReferer($_GET['referer']); + +if (!is_a($item, "PingtraxItems")) + die($trackback->recieve(false, $_GET['referer'] . " does not match any recorded item on the trackback API!")); + +$url = $_REQUEST["url"]; +if ($url) { + $excerpt = $_REQUEST["excerpt"]; + $name = ($_REQUEST["blog_name"]) ? $_REQUEST["blog_name"] : $url; + $subject = ($_REQUEST["title"]) ? $_REQUEST["title"] : $url; + $comment = "<strong> TrackBack from <a href=\"$url\">$name</a>:</strong><br />"; + $comment .= "<blockquote>$excerpt</blockquote>"; + + $pluginHandler = xoops_getmodulehandler('plugins', 'pingtrax'); + $remoteitem = $pluginHandler->getRemoteObject($item, $url, $name, $subject, $comment); + if (is_a($remoteitem, "PingtraxItems")) + { + $comment = $commentHandler->create(); + $comment->setVar('com_modid', $moduleHandler->getByDirname('pingtrax')->getVar('mid')); + $comment->setVar('com_title', $subject); + $comment->setVar('com_text', $comment); + $comment->setVar('com_created', time()); + $comment->setVar('com_url', $url); + $comment->setVar('com_ip', XoopsUserUtility::getIP(true)); + $comment->setVar('com_itemid', $item->getVar('id')); + $comment->setVar('dohtml', true); + $comment->setVar('dosmiley', true); + $comment->setVar('doxcode', true); + $comment->setVar('doimage', true); + $comment->setVar('dobr', true); + $commentHandler->insert($comment); + } +} else { + die($trackback->recieve(false, "Missing URL for trackback API!")); +} +die($trackback->recieve(true, "")); Modified: XoopsModules/pingtrax/trunk/class/items.php =================================================================== --- XoopsModules/pingtrax/trunk/class/items.php 2015-12-07 13:02:52 UTC (rev 13177) +++ XoopsModules/pingtrax/trunk/class/items.php 2015-12-07 13:42:44 UTC (rev 13178) @@ -30,6 +30,7 @@ * * CREATE TABLE `pingtrax_items` ( * `id` mediumint(20) NOT NULL AUTO_INCREMENT, + * `parent-id` mediumint(20) NOT NULL DEFAULT '0', * `referer` varchar(44) NOT NULL DEFAULT '', * `type` enum('local','remote','unknown') NOT NULL DEFAULT 'unknown', * `module-dirname` varchar(30) NOT NULL DEFAULT '', @@ -78,6 +79,7 @@ $this->XoopsObject(); $this->initVar('id', XOBJ_DTYPE_INT, null, false); + $this->initVar('parent-id', XOBJ_DTYPE_INT, null, false); $this->initVar('referer', XOBJ_DTYPE_OTHER, sha1(NULL), false, 44); $this->initVar('type', XOBJ_DTYPE_ENUM, 'unknown', true, false, false, false, array('local','remote','unknown')); $this->initVar('module-dirname', XOBJ_DTYPE_OTHER, '', false, 30); @@ -87,6 +89,7 @@ $this->initVar('module-get', XOBJ_DTYPE_ARRAY, array(), false); $this->initVar('item-author-uid', XOBJ_DTYPE_INT, 0, false); $this->initVar('item-author-name', XOBJ_DTYPE_TXTBOX, '', false, 64); + $this->initVar('item-category-id', XOBJ_DTYPE_INT, null, false); $this->initVar('item-title', XOBJ_DTYPE_TXTBOX, '', false, 180); $this->initVar('item-description', XOBJ_DTYPE_TXTBOX, '', false, 250); $this->initVar('item-protocol', XOBJ_DTYPE_ENUM, XOOPS_PROT, true, false, false, false, array('https://','http://')); Modified: XoopsModules/pingtrax/trunk/class/plugins.php =================================================================== --- XoopsModules/pingtrax/trunk/class/plugins.php 2015-12-07 13:02:52 UTC (rev 13177) +++ XoopsModules/pingtrax/trunk/class/plugins.php 2015-12-07 13:42:44 UTC (rev 13178) @@ -385,6 +385,55 @@ parent::__construct($db); } + + function getRemoteObject(PingtraxItems $item, $url = '', $name = '', $subject = '', $comment = '') + { + $ret = array(); + + if (file_exists($file = dirname(__DIR__) . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR . ($dirname = $item->getVar('module-dirname')) . '.php')) + { + require_once $file; + } elseif (file_exists($file = dirname(__DIR__) . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR . ($dirname = $this->_default) . '.php')) + { + require_once $file; + } + + if (class_exists($class = "PingtraxPlugins".ucfirst(strtolower($dirname))) && empty($this->_plugins[$dirname])) + { + $this->_plugins[$dirname] = new $class(); + } + if (is_object($this->_plugins[$dirname])) + { + $ret['type'] = 'remote'; + $ret['module-dirname'] = 'pingtrax'; + $ret['module-class'] = 'items'; + $ret['module-item-id'] = $item->getVar('id'); + $ret['parent-id'] = $item->getVar('id'); + $ret['item-author-name'] = $name; + $ret['item-title'] = $subject; + $ret['item-description'] = $comment; + $ret['module-php-self'] = $this->_plugins[$dirname]->getModulePHPSelf(); + $ret['module-get'] = $this->_plugins[$dirname]->getModuleGet(); + $ret['item-category-id'] = $this->_plugins[$dirname]->getItemCategoryID(); + $ret['item-protocol'] = $this->_plugins[$dirname]->getItemProtocol(); + $ret['item-domain'] = $this->_plugins[$dirname]->getItemDomain(); + $ret['item-referer-uri'] = $this->_plugins[$dirname]->getItemRefererURI(); + $ret['feed-protocol'] = $this->_plugins[$dirname]->getFeedProtocol(); + $ret['feed-domain'] = $this->_plugins[$dirname]->getFeedDomain(); + $ret['feed-referer-uri'] = $this->_plugins[$dirname]->getFeedRefererURI(); + $ret['item-php-self'] = $this->_plugins[$dirname]->getItemPHPSelf(); + $ret['referer'] = $this->getReferer($ret); + } + if (!empty($ret)) + { + $itemsHandler = xoops_getmodulehandler('items', 'pingtrax'); + $item = $itemsHandler->create(true); + $item->setVars($ret); + $ret = $itemsHandler->get($itemsHandler->insert($item)); + } + return $ret; + } + function getItemObject() { $ret = array(); Modified: XoopsModules/pingtrax/trunk/sql/mysql.sql =================================================================== --- XoopsModules/pingtrax/trunk/sql/mysql.sql 2015-12-07 13:02:52 UTC (rev 13177) +++ XoopsModules/pingtrax/trunk/sql/mysql.sql 2015-12-07 13:42:44 UTC (rev 13178) @@ -1,6 +1,7 @@ CREATE TABLE `pingtrax_items` ( `id` mediumint(20) NOT NULL AUTO_INCREMENT, + `parent-id` mediumint(20) NOT NULL DEFAULT '0' `referer` varchar(44) NOT NULL DEFAULT '', `type` enum('local','remote','unknown') NOT NULL DEFAULT 'unknown', `module-dirname` varchar(30) NOT NULL DEFAULT '', @@ -10,7 +11,6 @@ `module-get` tinytext, `item-author-uid` int(13) NOT NULL DEFAULT '0', `item-author-name` varchar(64) NOT NULL DEFAULT '', - `item-id` int(20) NOT NULL DEFAULT '0', `item-category-id` int(20) NOT NULL DEFAULT '0', `item-title` varchar(180) NOT NULL DEFAULT '', `item-description` varchar(250) NOT NULL DEFAULT '', |