diff --git a/extensions/akismet/.gitignore b/extensions/akismet/.gitignore index a4f3b125e..43eeee7fe 100644 --- a/extensions/akismet/.gitignore +++ b/extensions/akismet/.gitignore @@ -2,3 +2,5 @@ composer.phar .DS_Store Thumbs.db +bower_components +node_modules \ No newline at end of file diff --git a/extensions/akismet/bootstrap.php b/extensions/akismet/bootstrap.php index 763eda504..6759fa119 100644 --- a/extensions/akismet/bootstrap.php +++ b/extensions/akismet/bootstrap.php @@ -9,6 +9,10 @@ * file that was distributed with this source code. */ -require __DIR__.'/vendor/autoload.php'; +use Flarum\Akismet\Listener; +use Illuminate\Contracts\Events\Dispatcher; -return 'Flarum\Akismet\Extension'; +return function (Dispatcher $events) { + $events->subscribe(Listener\AddClientAssets::class); + $events->subscribe(Listener\FilterNewPosts::class); +}; \ No newline at end of file diff --git a/extensions/akismet/composer.json b/extensions/akismet/composer.json index a80d21fab..8fd456725 100644 --- a/extensions/akismet/composer.json +++ b/extensions/akismet/composer.json @@ -1,13 +1,37 @@ { + "name": "flarum/akismet", + "description": "Stop spam using the Akismet anti-spam service.", + "type": "flarum-extension", + "license": "MIT", + "authors": [ + { + "name": "Toby Zerner", + "email": "toby.zerner@gmail.com" + } + ], + "support": { + "issues": "https://github.com/flarum/core/issues", + "source": "https://github.com/flarum/akismet" + }, + "require": { + "flarum/core": "^0.1.0-beta.3", + "flarum/approval": "^0.1.0-beta.3", + "tijsverkoyen/akismet": "^1.1" + }, "autoload": { "psr-4": { "Flarum\\Akismet\\": "src/" } }, - "require": { - "tijsverkoyen/akismet": "^1.1" - }, - "scripts": { - "style": "phpcs --standard=PSR2 -np src" + "extra": { + "flarum-extension": { + "title": "Akismet", + "icon": { + "image": "icon.jpg", + "backgroundSize": "cover", + "backgroundColor": "#5e8e14", + "color": "#fff" + } + } } } diff --git a/extensions/akismet/composer.lock b/extensions/akismet/composer.lock deleted file mode 100644 index c47b9ab9e..000000000 --- a/extensions/akismet/composer.lock +++ /dev/null @@ -1,57 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", - "This file is @generated automatically" - ], - "hash": "f4f26918432f8f6ed40008ffd516708d", - "packages": [ - { - "name": "tijsverkoyen/akismet", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/tijsverkoyen/Akismet.git", - "reference": "0c5185956e11824ed310d134d38d0b2c936f3d3a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/tijsverkoyen/Akismet/zipball/0c5185956e11824ed310d134d38d0b2c936f3d3a", - "reference": "0c5185956e11824ed310d134d38d0b2c936f3d3a", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "php": ">=5.2.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD" - ], - "authors": [ - { - "name": "Tijs Verkoyen", - "email": "akismet@verkoyen.eu", - "role": "Developer" - } - ], - "description": "Akismet is a wrapper-class to communicate with the Akismet API.", - "homepage": "https://github.com/tijsverkoyen/Akismet", - "time": "2012-10-13 17:59:41" - } - ], - "packages-dev": [], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": [], - "platform-dev": [] -} diff --git a/extensions/akismet/flarum.json b/extensions/akismet/flarum.json deleted file mode 100644 index 5489efdac..000000000 --- a/extensions/akismet/flarum.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "akismet", - "title": "Akismet", - "description": "Stop spam using the Akismet anti-spam service.", - "keywords": [], - "version": "0.1.0-beta.2", - "author": { - "name": "Toby Zerner", - "email": "toby@flarum.org", - "homepage": "http://tobyzerner.com" - }, - "license": "MIT", - "require": { - "flarum": ">=0.1.0-beta.2", - "reports": ">=0.1.0-beta.2" - }, - "support": { - "source": "https://github.com/flarum/akismet", - "issues": "https://github.com/flarum/core/issues" - }, - "icon": { - "name": "filter", - "backgroundColor": "#5e8e14", - "color": "#fff" - } -} diff --git a/extensions/akismet/icon.jpg b/extensions/akismet/icon.jpg new file mode 100644 index 000000000..fe675a881 Binary files /dev/null and b/extensions/akismet/icon.jpg differ diff --git a/extensions/akismet/js/.gitignore b/extensions/akismet/js/.gitignore deleted file mode 100644 index 372e20a51..000000000 --- a/extensions/akismet/js/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -bower_components -node_modules -dist diff --git a/extensions/akismet/js/admin/Gulpfile.js b/extensions/akismet/js/admin/Gulpfile.js index d67501f07..e171a7ec4 100644 --- a/extensions/akismet/js/admin/Gulpfile.js +++ b/extensions/akismet/js/admin/Gulpfile.js @@ -2,6 +2,6 @@ var gulp = require('flarum-gulp'); gulp({ modules: { - 'akismet': 'src/**/*.js' + 'flarum/akismet': 'src/**/*.js' } }); diff --git a/extensions/akismet/js/admin/dist/extension.js b/extensions/akismet/js/admin/dist/extension.js new file mode 100644 index 000000000..403610509 --- /dev/null +++ b/extensions/akismet/js/admin/dist/extension.js @@ -0,0 +1,68 @@ +System.register('flarum/akismet/main', ['flarum/app', 'flarum/akismet/components/AkismetSettingsModal'], function (_export) { + 'use strict'; + + var app, AkismetSettingsModal; + return { + setters: [function (_flarumApp) { + app = _flarumApp['default']; + }, function (_flarumAkismetComponentsAkismetSettingsModal) { + AkismetSettingsModal = _flarumAkismetComponentsAkismetSettingsModal['default']; + }], + execute: function () { + + app.initializers.add('flarum-akismet', function () { + app.extensionSettings['flarum-akismet'] = function () { + return app.modal.show(new AkismetSettingsModal()); + }; + }); + } + }; +});;System.register('flarum/akismet/components/AkismetSettingsModal', ['flarum/components/SettingsModal'], function (_export) { + 'use strict'; + + var SettingsModal, AkismetSettingsModal; + return { + setters: [function (_flarumComponentsSettingsModal) { + SettingsModal = _flarumComponentsSettingsModal['default']; + }], + execute: function () { + AkismetSettingsModal = (function (_SettingsModal) { + babelHelpers.inherits(AkismetSettingsModal, _SettingsModal); + + function AkismetSettingsModal() { + babelHelpers.classCallCheck(this, AkismetSettingsModal); + babelHelpers.get(Object.getPrototypeOf(AkismetSettingsModal.prototype), 'constructor', this).apply(this, arguments); + } + + babelHelpers.createClass(AkismetSettingsModal, [{ + key: 'className', + value: function className() { + return 'AkismetSettingsModal Modal--small'; + } + }, { + key: 'title', + value: function title() { + return 'Akismet Settings'; + } + }, { + key: 'form', + value: function form() { + return [m( + 'div', + { className: 'Form-group' }, + m( + 'label', + null, + 'API Key' + ), + m('input', { className: 'FormControl', bidi: this.setting('flarum-akismet.api_key') }) + )]; + } + }]); + return AkismetSettingsModal; + })(SettingsModal); + + _export('default', AkismetSettingsModal); + } + }; +}); \ No newline at end of file diff --git a/extensions/akismet/js/admin/src/components/AkismetSettingsModal.js b/extensions/akismet/js/admin/src/components/AkismetSettingsModal.js index c6b274b93..3e1854c25 100644 --- a/extensions/akismet/js/admin/src/components/AkismetSettingsModal.js +++ b/extensions/akismet/js/admin/src/components/AkismetSettingsModal.js @@ -13,7 +13,7 @@ export default class AkismetSettingsModal extends SettingsModal { return [
- +
]; } diff --git a/extensions/akismet/js/admin/src/main.js b/extensions/akismet/js/admin/src/main.js index ed8b1dac9..548fee185 100644 --- a/extensions/akismet/js/admin/src/main.js +++ b/extensions/akismet/js/admin/src/main.js @@ -1,7 +1,7 @@ import app from 'flarum/app'; -import AkismetSettingsModal from 'akismet/components/AkismetSettingsModal'; +import AkismetSettingsModal from 'flarum/akismet/components/AkismetSettingsModal'; -app.initializers.add('akismet', () => { - app.extensionSettings.akismet = () => app.modal.show(new AkismetSettingsModal()); +app.initializers.add('flarum-akismet', () => { + app.extensionSettings['flarum-akismet'] = () => app.modal.show(new AkismetSettingsModal()); }); diff --git a/extensions/akismet/js/forum/Gulpfile.js b/extensions/akismet/js/forum/Gulpfile.js index d67501f07..e171a7ec4 100644 --- a/extensions/akismet/js/forum/Gulpfile.js +++ b/extensions/akismet/js/forum/Gulpfile.js @@ -2,6 +2,6 @@ var gulp = require('flarum-gulp'); gulp({ modules: { - 'akismet': 'src/**/*.js' + 'flarum/akismet': 'src/**/*.js' } }); diff --git a/extensions/akismet/js/forum/dist/extension.js b/extensions/akismet/js/forum/dist/extension.js new file mode 100644 index 000000000..9b60b19d9 --- /dev/null +++ b/extensions/akismet/js/forum/dist/extension.js @@ -0,0 +1,43 @@ +System.register('flarum/akismet/main', ['flarum/extend', 'flarum/app', 'flarum/utils/PostControls', 'flarum/components/CommentPost'], function (_export) { + 'use strict'; + + var extend, override, app, PostControls, CommentPost; + return { + setters: [function (_flarumExtend) { + extend = _flarumExtend.extend; + override = _flarumExtend.override; + }, function (_flarumApp) { + app = _flarumApp['default']; + }, function (_flarumUtilsPostControls) { + PostControls = _flarumUtilsPostControls['default']; + }, function (_flarumComponentsCommentPost) { + CommentPost = _flarumComponentsCommentPost['default']; + }], + execute: function () { + + app.initializers.add('flarum-akismet', function () { + extend(PostControls, 'destructiveControls', function (items, post) { + if (items.approve) { + var flags = post.flags(); + + if (flags && flags.some(function (flag) { + return flag.type() === 'akismet'; + })) { + babelHelpers._extends(items.approve.content.props, { + children: 'Not Spam' + }); + } + } + }); + + override(CommentPost.prototype, 'flagReason', function (original, flag) { + if (flag.type() === 'akismet') { + return 'Akismet flagged as Spam'; + } + + return original(flag); + }); + }, -20); // run after the approval extension + } + }; +}); \ No newline at end of file diff --git a/extensions/akismet/js/forum/src/main.js b/extensions/akismet/js/forum/src/main.js index 8d559d81a..53205a863 100644 --- a/extensions/akismet/js/forum/src/main.js +++ b/extensions/akismet/js/forum/src/main.js @@ -4,7 +4,7 @@ import app from 'flarum/app'; import PostControls from 'flarum/utils/PostControls'; import CommentPost from 'flarum/components/CommentPost'; -app.initializers.add('akismet', () => { +app.initializers.add('flarum-akismet', () => { extend(PostControls, 'destructiveControls', function(items, post) { if (items.approve) { const flags = post.flags(); diff --git a/extensions/akismet/locale/en.yml b/extensions/akismet/locale/en.yml deleted file mode 100644 index 4df16ec26..000000000 --- a/extensions/akismet/locale/en.yml +++ /dev/null @@ -1,2 +0,0 @@ -akismet: - # hello_world: "Hello, world!" diff --git a/extensions/akismet/scripts/compile.sh b/extensions/akismet/scripts/compile.sh new file mode 100755 index 000000000..b0d8e8bd3 --- /dev/null +++ b/extensions/akismet/scripts/compile.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +# This script compiles the extension so that it can be used in a Flarum +# installation. It should be run from the root directory of the extension. + +base=$PWD + +cd "${base}/js" + +if [ -f bower.json ]; then + bower install +fi + +for app in forum admin; do + cd "${base}/js" + + if [ -d $app ]; then + cd $app + + if [ -f bower.json ]; then + bower install + fi + + npm install + gulp --production + fi +done diff --git a/extensions/akismet/src/Extension.php b/extensions/akismet/src/Extension.php deleted file mode 100644 index acb4901f6..000000000 --- a/extensions/akismet/src/Extension.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Flarum\Akismet; - -use Flarum\Support\Extension as BaseExtension; -use Illuminate\Events\Dispatcher; - -class Extension extends BaseExtension -{ - public function listen(Dispatcher $events) - { - $events->subscribe('Flarum\Akismet\Listeners\AddClientAssets'); - $events->subscribe('Flarum\Akismet\Listeners\ValidatePost'); - } -} diff --git a/extensions/akismet/src/Listener/AddClientAssets.php b/extensions/akismet/src/Listener/AddClientAssets.php new file mode 100644 index 000000000..c6a48ad92 --- /dev/null +++ b/extensions/akismet/src/Listener/AddClientAssets.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Akismet\Listener; + +use Flarum\Event\ConfigureClientView; +use Illuminate\Contracts\Events\Dispatcher; + +class AddClientAssets +{ + /** + * @param Dispatcher $events + */ + public function subscribe(Dispatcher $events) + { + $events->listen(ConfigureClientView::class, [$this, 'addAssets']); + } + + /** + * @param ConfigureClientView $event + */ + public function addAssets(ConfigureClientView $event) + { + if ($event->isForum()) { + $event->addAssets([ + __DIR__.'/../../js/forum/dist/extension.js' + ]); + $event->addBootstrapper('flarum/akismet/main'); + $event->addTranslations('flarum-akismet.forum'); + } + + if ($event->isAdmin()) { + $event->addAssets([ + __DIR__ . '/../../js/admin/dist/extension.js' + ]); + $event->addBootstrapper('flarum/akismet/main'); + $event->addTranslations('flarum-akismet.admin'); + } + } +} diff --git a/extensions/akismet/src/Listeners/ValidatePost.php b/extensions/akismet/src/Listener/FilterNewPosts.php similarity index 66% rename from extensions/akismet/src/Listeners/ValidatePost.php rename to extensions/akismet/src/Listener/FilterNewPosts.php index 1b70d6a31..055be379e 100644 --- a/extensions/akismet/src/Listeners/ValidatePost.php +++ b/extensions/akismet/src/Listener/FilterNewPosts.php @@ -8,32 +8,51 @@ * file that was distributed with this source code. */ -namespace Flarum\Akismet\Listeners; +namespace Flarum\Akismet\Listener; -use Flarum\Events\PostWillBeSaved; +use Flarum\Approval\Event\PostWasApproved; +use Flarum\Core; +use Flarum\Event\PostWillBeSaved; +use Flarum\Flags\Flag; +use Flarum\Foundation\Application; +use Flarum\Settings\SettingsRepository; use Illuminate\Contracts\Events\Dispatcher; use TijsVerkoyen\Akismet\Akismet; -use Flarum\Core; -use Flarum\Core\Posts\CommentPost; -use Flarum\Core\Settings\SettingsRepository; -use Flarum\Flags\Flag; -use Flarum\Approval\Events\PostWasApproved; -class ValidatePost +class FilterNewPosts { + /** + * @var SettingsRepository + */ protected $settings; - public function __construct(SettingsRepository $settings) + /** + * @var Application + */ + protected $app; + + /** + * @param SettingsRepository $settings + * @param Application $app + */ + public function __construct(SettingsRepository $settings, Application $app) { $this->settings = $settings; + $this->app = $app; } + /** + * @param Dispatcher $events + */ public function subscribe(Dispatcher $events) { $events->listen(PostWillBeSaved::class, [$this, 'validatePost']); $events->listen(PostWasApproved::class, [$this, 'submitHam']); } + /** + * @param PostWillBeSaved $event + */ public function validatePost(PostWillBeSaved $event) { $post = $event->post; @@ -42,7 +61,7 @@ class ValidatePost return; } - $akismet = new Akismet($this->settings->get('akismet.api_key'), Core::url()); + $akismet = new Akismet($this->settings->get('flarum-akismet.api_key'), $this->app->url()); $isSpam = $akismet->isSpam( $post->content, @@ -70,6 +89,9 @@ class ValidatePost } } + /** + * @param PostWasApproved $event + */ public function submitHam(PostWasApproved $event) { // TODO diff --git a/extensions/akismet/src/Listeners/AddClientAssets.php b/extensions/akismet/src/Listeners/AddClientAssets.php deleted file mode 100644 index 854d60c77..000000000 --- a/extensions/akismet/src/Listeners/AddClientAssets.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Flarum\Akismet\Listeners; - -use Flarum\Events\RegisterLocales; -use Flarum\Events\BuildClientView; -use Illuminate\Contracts\Events\Dispatcher; - -class AddClientAssets -{ - public function subscribe(Dispatcher $events) - { - $events->listen(RegisterLocales::class, [$this, 'addLocale']); - $events->listen(BuildClientView::class, [$this, 'addAssets']); - } - - public function addLocale(RegisterLocales $event) - { - $event->addTranslations('en', __DIR__.'/../../locale/en.yml'); - } - - public function addAssets(BuildClientView $event) - { - $event->forumAssets([ - __DIR__.'/../../js/forum/dist/extension.js' - ]); - - $event->forumBootstrapper('akismet/main'); - - $event->forumTranslations([ - // 'akismet.hello_world' - ]); - - $event->adminAssets([ - __DIR__.'/../../js/admin/dist/extension.js' - ]); - - $event->adminBootstrapper('akismet/main'); - - $event->adminTranslations([ - // 'akismet.hello_world' - ]); - } -}