diff --git a/core/extension.class.php b/core/extension.class.php
index e7561450..eff3f6ca 100644
--- a/core/extension.class.php
+++ b/core/extension.class.php
@@ -82,6 +82,9 @@
* find the thread where the original was posted >_<
*/
abstract class Extension {
+ /** @var array which DBs this ext supports (blank for 'all') */
+ protected $db_support = [];
+
/** this theme's Themelet object */
public $theme;
@@ -97,6 +100,15 @@ abstract class Extension {
if(is_null($this->theme)) $this->theme = $this->get_theme_object($child, false);
}
+
+ public function is_live() {
+ global $database;
+ return (
+ empty($this->db_support) ||
+ in_array($database->get_driver_name(), $this->db_support)
+ );
+ }
+
/**
* Find the theme object for a given extension.
*
diff --git a/core/util.inc.php b/core/util.inc.php
index 90d60e91..fa92cea1 100644
--- a/core/util.inc.php
+++ b/core/util.inc.php
@@ -1351,16 +1351,12 @@ function _set_event_listeners() {
// don't do anything
}
elseif(is_subclass_of($class, "Extension")) {
+ /** @var Extension $extension */
$extension = new $class();
$extension->i_am($extension);
// skip extensions which don't support our current database
- if(property_exists($extension, 'db_support')) {
- global $database;
- if(!in_array($database->get_driver_name(), $extension->db_support)) {
- continue;
- }
- }
+ if(!$extension->is_live()) continue;
foreach(get_class_methods($extension) as $method) {
if(substr($method, 0, 2) == "on") {
@@ -1402,6 +1398,19 @@ function _dump_event_listeners($event_listeners, $path) {
file_put_contents($path, $p);
}
+/**
+ * @param $ext_name string
+ * @return bool
+ */
+function ext_is_live($ext_name) {
+ if (class_exists($ext_name)) {
+ /** @var Extension $ext */
+ $ext = new $ext_name();
+ return $ext->is_live();
+ }
+ return false;
+}
+
/** @private */
global $_shm_event_count;
diff --git a/ext/comment/main.php b/ext/comment/main.php
index 3bb4ca08..1ad9bf99 100644
--- a/ext/comment/main.php
+++ b/ext/comment/main.php
@@ -318,17 +318,14 @@ class CommentList extends Extension {
private function build_page(/*int*/ $current_page) {
global $database, $user;
- if(class_exists("Ratings")) {
- $user_ratings = Ratings::get_user_privs($user);
- } else {
- $user_ratings = "";
- }
-
$where = SPEED_HAX ? "WHERE posted > now() - interval '24 hours'" : "";
$total_pages = $database->cache->get("comment_pages");
if(empty($total_pages)) {
- $total_pages = (int)($database->get_one("SELECT COUNT(c1) FROM (SELECT COUNT(image_id) AS c1 FROM comments $where GROUP BY image_id) AS s1") / 10);
+ $total_pages = (int)($database->get_one("
+ SELECT COUNT(c1)
+ FROM (SELECT COUNT(image_id) AS c1 FROM comments $where GROUP BY image_id) AS s1
+ ") / 10);
$database->cache->set("comment_pages", $total_pages, 600);
}
@@ -342,24 +339,31 @@ class CommentList extends Extension {
$get_threads = "
SELECT image_id,MAX(posted) AS latest
- FROM comments $where
+ FROM comments
+ $where
GROUP BY image_id
ORDER BY latest DESC
LIMIT :limit OFFSET :offset
";
$result = $database->Execute($get_threads, array("limit"=>$threads_per_page, "offset"=>$start));
+ if(ext_is_live("Ratings")) {
+ $user_ratings = Ratings::get_user_privs($user);
+ } else {
+ $user_ratings = "";
+ }
+
$images = array();
while($row = $result->fetch()) {
$image = Image::by_id($row["image_id"]);
- if (!is_null($image)) {
- $comments = $this->get_comments($image->id);
- if(class_exists("Ratings")) {
- if(strpos($user_ratings, $image->rating) === FALSE) {
- $image = null; // this is "clever", I may live to regret it
- }
+ if(ext_is_live("Ratings") && !is_null($image)) {
+ if(strpos($user_ratings, $image->rating) === FALSE) {
+ $image = null; // this is "clever", I may live to regret it
}
- if(!is_null($image)) $images[] = array($image, $comments);
+ }
+ if(!is_null($image)) {
+ $comments = $this->get_comments($image->id);
+ $images[] = array($image, $comments);
}
}
diff --git a/ext/comment/test.php b/ext/comment/test.php
index d52ce896..442a79b8 100644
--- a/ext/comment/test.php
+++ b/ext/comment/test.php
@@ -1,66 +1,71 @@
log_in_as_admin();
- $this->get_page("setup");
- $this->set_field("_config_comment_limit", "100");
- $this->click("Save Settings");
+ global $config;
+ parent::setUp();
+ $config->set_int("comment_limit", 100);
$this->log_out();
}
function tearDown() {
- $this->log_in_as_admin();
- $this->get_page("setup");
- $this->set_field("_config_comment_limit", "10");
- $this->click("Save Settings");
- $this->log_out();
+ global $config;
+ $config->set_int("comment_limit", 10);
+ parent::tearDown();
}
function testCommentsPage() {
+ global $user;
+
$this->log_in_as_user();
$image_id = $this->post_image("tests/pbx_screenshot.jpg", "pbx");
# a good comment
+ send_event(new CommentPostingEvent($image_id, $user, "Test Comment ASDFASDF"));
$this->get_page("post/view/$image_id");
- $this->set_field('comment', "Test Comment ASDFASDF");
- $this->click("Post Comment");
$this->assert_text("ASDFASDF");
# dupe
- $this->get_page("post/view/$image_id");
- $this->set_field('comment', "Test Comment ASDFASDF");
- $this->click("Post Comment");
- $this->assert_text("try and be more original");
+ try {
+ send_event(new CommentPostingEvent($image_id, $user, "Test Comment ASDFASDF"));
+ }
+ catch(CommentPostingException $e) {
+ $this->assertContains("try and be more original", $e->getMessage());
+ }
# empty comment
- $this->get_page("post/view/$image_id");
- $this->set_field('comment', "");
- $this->click("Post Comment");
- $this->assert_text("Comments need text...");
+ try {
+ send_event(new CommentPostingEvent($image_id, $user, ""));
+ }
+ catch(CommentPostingException $e) {
+ $this->assertContains("Comments need text", $e->getMessage());
+ }
# whitespace is still empty...
- $this->get_page("post/view/$image_id");
- $this->set_field('comment', " \t\r\n");
- $this->click("Post Comment");
- $this->assert_text("Comments need text...");
+ try {
+ send_event(new CommentPostingEvent($image_id, $user, " \t\r\n"));
+ }
+ catch(CommentPostingException $e) {
+ $this->assertContains("Comments need text", $e->getMessage());
+ }
# repetitive (aka. gzip gives >= 10x improvement)
- $this->get_page("post/view/$image_id");
- $this->set_field('comment', str_repeat("U", 5000));
- $this->click("Post Comment");
- $this->assert_text("Comment too repetitive~");
+ try {
+ send_event(new CommentPostingEvent($image_id, $user, str_repeat("U", 5000)));
+ }
+ catch(CommentPostingException $e) {
+ $this->assertContains("Comment too repetitive", $e->getMessage());
+ }
# test UTF8
+ send_event(new CommentPostingEvent($image_id, $user, "Test Comment むちむち"));
$this->get_page("post/view/$image_id");
- $this->set_field('comment', "Test Comment むちむち");
- $this->click("Post Comment");
$this->assert_text("むちむち");
# test that search by comment metadata works
- $this->get_page("post/list/commented_by=test/1");
- $this->assert_title("Image $image_id: pbx");
- $this->get_page("post/list/comments=2/1");
- $this->assert_title("Image $image_id: pbx");
+// $this->get_page("post/list/commented_by=test/1");
+// $this->assert_title("Image $image_id: pbx");
+// $this->get_page("post/list/comments=2/1");
+// $this->assert_title("Image $image_id: pbx");
$this->log_out();
@@ -80,6 +85,7 @@ class CommentListTest {
$this->assert_no_text('ASDFASDF');
}
+ /*
function testSingleDel() {
$this->log_in_as_admin();
$image_id = $this->post_image("tests/pbx_screenshot.jpg", "pbx");
@@ -100,5 +106,5 @@ class CommentListTest {
$this->delete_image($image_id);
$this->log_out();
}
+ */
}
-
diff --git a/ext/featured/main.php b/ext/featured/main.php
index 0b643633..85e2459e 100644
--- a/ext/featured/main.php
+++ b/ext/featured/main.php
@@ -69,7 +69,7 @@ class Featured extends Extension {
$database->cache->set("featured_image_object:$fid", $image, 600);
}
if(!is_null($image)) {
- if(class_exists("Ratings")) {
+ if(ext_is_live("Ratings")) {
if(strpos(Ratings::get_user_privs($user), $image->rating) === FALSE) {
return;
}
diff --git a/ext/handle_404/main.php b/ext/handle_404/main.php
index 518140f2..b7996848 100644
--- a/ext/handle_404/main.php
+++ b/ext/handle_404/main.php
@@ -45,7 +45,7 @@ class Handle404 extends Extension {
foreach($blocks as $block) {
if($block->section == "main") $n++; // more hax.
}
- if(class_exists("Blotter")) {
+ if(ext_is_live("Chatbox")) {
$n--; // even more hax.
}
return $n;
diff --git a/ext/handle_404/test.php b/ext/handle_404/test.php
index 961eeff6..ff84edac 100644
--- a/ext/handle_404/test.php
+++ b/ext/handle_404/test.php
@@ -2,9 +2,10 @@
class Handle404Test extends ShimmiePHPUnitTestCase {
function test404Handler() {
$this->get_page('not/a/page');
- $this->assert_response(404);
- $this->assert_title('404');
+ // most descriptive error first
$this->assert_text("No handler could be found for the page 'not/a/page'");
+ $this->assert_title('404');
+ $this->assert_response(404);
$this->get_page('favicon.ico');
$this->assert_response(200);
diff --git a/ext/image/main.php b/ext/image/main.php
index 784ef564..3eddd7b2 100644
--- a/ext/image/main.php
+++ b/ext/image/main.php
@@ -328,7 +328,7 @@ class ImageIO extends Extension {
if($handler == "merge" || isset($_GET['update'])) {
$merged = array_merge($image->get_tag_array(), $existing->get_tag_array());
send_event(new TagSetEvent($existing, $merged));
- if(isset($_GET['rating']) && isset($_GET['update']) && class_exists("Ratings")){
+ if(isset($_GET['rating']) && isset($_GET['update']) && ext_is_live("Ratings")){
send_event(new RatingSetEvent($existing, $_GET['rating']));
}
if(isset($_GET['source']) && isset($_GET['update'])){
diff --git a/ext/pools/main.php b/ext/pools/main.php
index 6536a527..aeb01996 100644
--- a/ext/pools/main.php
+++ b/ext/pools/main.php
@@ -700,7 +700,7 @@ class Pools extends Extension {
// WE CHECK IF THE EXTENSION RATING IS INSTALLED, WHICH VERSION AND IF IT
// WORKS TO SHOW/HIDE SAFE, QUESTIONABLE, EXPLICIT AND UNRATED IMAGES FROM USER
- if(class_exists("Ratings")) {
+ if(ext_is_live("Ratings")) {
$rating = Ratings::privs_to_sql(Ratings::get_user_privs($user));
}
if (isset($rating) && !empty($rating)) {
diff --git a/ext/rating/main.php b/ext/rating/main.php
index 5177e3fc..22b331d8 100644
--- a/ext/rating/main.php
+++ b/ext/rating/main.php
@@ -38,7 +38,7 @@ class RatingSetEvent extends Event {
}
class Ratings extends Extension {
- public $db_support = ['mysql']; // ?
+ protected $db_support = ['mysql']; // ?
/**
* @return int
@@ -167,7 +167,7 @@ class Ratings extends Extension {
/**
* @param \User $user
- * @return null|string
+ * @return string
*/
public static function get_user_privs(User $user) {
global $config;
diff --git a/ext/relatationships/main.php b/ext/relatationships/main.php
index 9126a816..6cd1a7b0 100644
--- a/ext/relatationships/main.php
+++ b/ext/relatationships/main.php
@@ -7,7 +7,7 @@
*/
class Relationships extends Extension {
- public $db_support = ['mysql', 'pgsql'];
+ protected $db_support = ['mysql', 'pgsql'];
public function onInitExt(InitExtEvent $event) {
global $config, $database;
diff --git a/ext/tips/main.php b/ext/tips/main.php
index 4c6ab6a3..079e53fb 100644
--- a/ext/tips/main.php
+++ b/ext/tips/main.php
@@ -9,7 +9,7 @@
*/
class Tips extends Extension {
- public $db_support = ['mysql', 'sqlite']; // rand() ?
+ protected $db_support = ['mysql', 'sqlite']; // rand() ?
public function onInitExt(InitExtEvent $event) {
global $config, $database;
diff --git a/ext/upload/main.php b/ext/upload/main.php
index b3d05143..27862703 100644
--- a/ext/upload/main.php
+++ b/ext/upload/main.php
@@ -355,7 +355,7 @@ class Upload extends Extension {
}
// Checks if url contains rating, also checks if the rating extension is enabled.
- if($config->get_string("transload_engine", "none") != "none" && class_exists("Ratings") && !empty($_GET['rating'])) {
+ if($config->get_string("transload_engine", "none") != "none" && ext_is_live("Ratings") && !empty($_GET['rating'])) {
// Rating event will validate that this is s/q/e/u
$rating = strtolower($_GET['rating']);
$rating = $rating[0];
diff --git a/themes/danbooru/comment.theme.php b/themes/danbooru/comment.theme.php
index ca392da1..5e959e10 100644
--- a/themes/danbooru/comment.theme.php
+++ b/themes/danbooru/comment.theme.php
@@ -50,7 +50,7 @@ class CustomCommentListTheme extends CommentListTheme {
}
$p = autodate($image->posted);
- $r = class_exists("Ratings") ? "Rating ".Ratings::rating_to_human($image->rating) : "";
+ $r = ext_is_live("Ratings") ? "Rating ".Ratings::rating_to_human($image->rating) : "";
$comment_html = "Date $p $s User $un $s $r
Tags $t
";
$comment_count = count($comments);
diff --git a/themes/danbooru/view.theme.php b/themes/danbooru/view.theme.php
index 72164e6e..d7b5aae6 100644
--- a/themes/danbooru/view.theme.php
+++ b/themes/danbooru/view.theme.php
@@ -38,14 +38,12 @@ class CustomViewImageTheme extends ViewImageTheme {
$html .= "
Source: link";
}
- if(class_exists("Ratings")) {
+ if(ext_is_live("Ratings")) {
if($image->rating == null || $image->rating == "u"){
$image->rating = "u";
}
- if(class_exists("Ratings")) {
- $h_rating = Ratings::rating_to_human($image->rating);
- $html .= "
Rating: $h_rating";
- }
+ $h_rating = Ratings::rating_to_human($image->rating);
+ $html .= "
Rating: $h_rating";
}
return $html;
diff --git a/themes/danbooru2/comment.theme.php b/themes/danbooru2/comment.theme.php
index 224f4c77..081537bb 100644
--- a/themes/danbooru2/comment.theme.php
+++ b/themes/danbooru2/comment.theme.php
@@ -44,7 +44,7 @@ class CustomCommentListTheme extends CommentListTheme {
}
$p = autodate($image->posted);
- $r = class_exists("Ratings") ? "Rating ".Ratings::rating_to_human($image->rating) : "";
+ $r = ext_is_live("Ratings") ? "Rating ".Ratings::rating_to_human($image->rating) : "";
$comment_html = "Date $p $s User $un $s $r
Tags $t
";
$comment_count = count($comments);
diff --git a/themes/danbooru2/view.theme.php b/themes/danbooru2/view.theme.php
index 10d1a3f5..d4472067 100644
--- a/themes/danbooru2/view.theme.php
+++ b/themes/danbooru2/view.theme.php
@@ -45,11 +45,11 @@ class CustomViewImageTheme extends ViewImageTheme {
$html .= "
Source: link";
}
- if(class_exists("Ratings")) {
+ if(ext_is_live("Ratings")) {
if($image->rating == null || $image->rating == "u"){
$image->rating = "u";
}
- if(class_exists("Ratings")) {
+ if(ext_is_live("Ratings")) {
$h_rating = Ratings::rating_to_human($image->rating);
$html .= "
Rating: $h_rating";
}
diff --git a/themes/lite/view.theme.php b/themes/lite/view.theme.php
index 7c2bbf85..b2848072 100644
--- a/themes/lite/view.theme.php
+++ b/themes/lite/view.theme.php
@@ -44,7 +44,7 @@ class CustomViewImageTheme extends ViewImageTheme {
$html .= "
Source: link";
}
- if(class_exists("Ratings")) {
+ if(ext_is_live("Ratings")) {
if($image->rating == null || $image->rating == "u"){
$image->rating = "u";
}