nodebb-plugin-spam-be-gone-test
Version:
anti spam using both Google Recaptcha, Akismet.com, StopForumSpam.com & ProjectHoneyPot.com
119 lines (102 loc) • 3.5 kB
JavaScript
$(function() {
var pluginName = 'spam-be-gone';
var readyTimeoutId = null;
function onRecaptachaArgsReady (callback) {
if (window.plugin && plugin[pluginName] && plugin[pluginName].recaptchaArgs && $('#' + plugin[pluginName].recaptchaArgs.targetId).length) {
clearTimeout(readyTimeoutId);
return callback();
}
readyTimeoutId && clearTimeout(readyTimeoutId);
readyTimeoutId = setTimeout(function () { onRecaptachaArgsReady(callback); }, 350);
}
function onRegisterPage () {
onRecaptachaArgsReady(function () {
if (! $('script[src*="www.recaptcha.net/recaptcha/api.js"]').length) {
injectScript('//www.recaptcha.net/recaptcha/api.js?onload=__nodebbSpamBeGoneCreateCaptcha__&render=explicit&hl=' + (plugin[pluginName].recaptchaArgs.options.hl || 'en'));
} else if (grecaptcha) {
window.__nodebbSpamBeGoneCreateCaptcha__();
}
});
}
function onAccountProfilePage (data) {
var $btn = $('#spamBeGoneReportUserBtn');
$btn.off('click');
$btn.on('click', function (e) {
e.preventDefault();
reportUser(data.title);
var $parentBtn = $btn.parents('.account-fab').find('[data-toggle="dropdown"]');
$parentBtn.dropdown && $parentBtn.dropdown('toggle');
return false;
});
}
function onManageRegistrationPage (data) {
var $btn = $('button.report-spam-user');
$btn.on('click', function (e) {
e.preventDefault();
reportUser($btn.parents('[data-username]').attr('data-username'));
return false;
});
}
function reportUser (username) {
return $.post('/api/user/' + username + '/' + pluginName + '/report')
.then(function () {
app.alertSuccess('User reported!');
})
.catch(function (e) {
app.alertError(e.responseJSON.message || '[spam-be-gone:something-went-wrong]');
});
}
function injectTag (tagName, attrs, options) {
options || (options = {});
var tag = document.createElement(tagName);
tag.onload = options.onload || null; // @ie8; img.onload cannot be undefined
var setAttr = tag.setAttribute
? function(tag, key, value) { tag.setAttribute(key, value); return tag;}
: function(tag, key, value) { tag[key] = value; return tag;};
Object.keys(attrs).forEach(function(key) {
tag = setAttr(tag, key, attrs[key]);
});
if (options.insertBefore) {
options.insertBefore.parentNode.insertBefore(tag, options.insertBefore);
} else if (options.appendChild) {
options.appendChild.appendChild(tag);
} else {
var scripts = document.getElementsByTagName('script');
scripts[scripts.length - 1].parentNode.appendChild(tag);
}
}
function injectScript (src, options) {
options || (options = {});
injectTag('script', {src: src, type: 'text/javascript', async: '', defer: '' }, options);
}
$(window).on('action:ajaxify.end', function(e, data) {
switch (data.tpl_url) {
case 'register':
onRegisterPage(data);
break;
case 'account/profile':
onAccountProfilePage(data);
break;
case 'admin/manage/registration':
onManageRegistrationPage(data);
default:
return void 0;
}
});
});
window.__nodebbSpamBeGoneCreateCaptcha__ = function () {
var args = plugin['spam-be-gone'].recaptchaArgs;
grecaptcha.render(
args.targetId,
{
theme: args.options.theme,
sitekey: args.publicKey,
callback: function() {
var error = utils.param('error');
if (error) {
app.alertError(error);
}
}
}
);
};