FEATURE: use groups to control who sees ads

A new setting has been added in Admin > Settings > Ad Plugin called
"no ads for groups". Add group names to this list. If a user belongs
to any of the groups, they will not see any ads. This is an alternative
to using trust level settings like "adsense through trust level".
This commit is contained in:
Neil Lalonde
2019-04-17 11:36:50 -04:00
parent 6097e6f097
commit 4fd7caffd6
8 changed files with 183 additions and 43 deletions
@@ -0,0 +1,23 @@
import computed from "ember-addons/ember-computed-decorators";
export default Ember.Component.extend({
@computed()
showToGroups: function() {
const currentUser = Discourse.User.current();
if (
!currentUser ||
!currentUser.get("groups") ||
!this.siteSettings.no_ads_for_groups ||
this.siteSettings.no_ads_for_groups.length === 0
) {
return true;
}
const noAdsGroupNames = this.siteSettings.no_ads_for_groups.split("|");
return !currentUser
.get("groups")
.any(group => noAdsGroupNames.includes(group.name));
}
});
@@ -1,3 +1,4 @@
import AdComponent from "discourse/plugins/discourse-adplugin/discourse/components/ad_component";
import {
default as computed,
observes
@@ -146,7 +147,7 @@ if (Discourse.SiteSettings.adsense_publisher_code) {
}
}
export default Ember.Component.extend({
export default AdComponent.extend({
classNameBindings: [
":google-adsense",
"classForSlot",
@@ -193,7 +194,7 @@ export default Ember.Component.extend({
},
@observes("listLoading")
waitForLoad: function() {
waitForLoad() {
if (this.get("adRequested")) {
return;
} // already requested that this ad unit be populated
@@ -203,34 +204,34 @@ export default Ember.Component.extend({
},
@computed("ad_width")
isResponsive: function(adWidth) {
isResponsive(adWidth) {
return adWidth === "auto";
},
@computed("placement", "checkTrustLevels")
classForSlot: function(placement, shown) {
return shown ? `adsense-${placement}`.htmlSafe() : "";
@computed("placement", "showAd")
classForSlot(placement, showAd) {
return showAd ? `adsense-${placement}`.htmlSafe() : "";
},
@computed("isResponsive")
autoAdFormat: function(isResponsive) {
autoAdFormat(isResponsive) {
return isResponsive ? "auto".htmlSafe() : false;
},
@computed("ad_width", "ad_height", "isResponsive")
adWrapperStyle: function(w, h, isResponsive) {
adWrapperStyle(w, h, isResponsive) {
return (isResponsive ? "" : `width: ${w}; height: ${h};`).htmlSafe();
},
@computed("adWrapperStyle", "isResponsive")
adInsStyle: function(adWrapperStyle, isResponsive) {
adInsStyle(adWrapperStyle, isResponsive) {
return `display: ${
isResponsive ? "block" : "inline-block"
}; ${adWrapperStyle}`.htmlSafe();
},
@computed()
checkTrustLevels: function() {
showToTrustLevel() {
return !(
currentUser &&
currentUser.get("trust_level") >
@@ -238,8 +239,12 @@ export default Ember.Component.extend({
);
},
@computed("checkTrustLevels")
showAd: function(shown) {
return shown && Discourse.SiteSettings.adsense_publisher_code;
@computed("showToTrustLevel", "showToGroups")
showAd(showToTrustLevel, showToGroups) {
return (
showToTrustLevel &&
showToGroups &&
Discourse.SiteSettings.adsense_publisher_code
);
}
});
@@ -1,3 +1,9 @@
import AdComponent from "discourse/plugins/discourse-adplugin/discourse/components/ad_component";
import {
default as computed,
observes,
on
} from "ember-addons/ember-computed-decorators";
import loadScript from "discourse/lib/load-script";
var currentUser = Discourse.User.current(),
@@ -198,51 +204,56 @@ function loadGoogle() {
return _promise;
}
export default Ember.Component.extend({
export default AdComponent.extend({
classNameBindings: ["adUnitClass"],
classNames: ["google-dfp-ad"],
loadedGoogletag: false,
refreshOnChange: null,
divId: function() {
if (this.get("postNumber")) {
return (
"div-gpt-ad-" + this.get("placement") + "-" + this.get("postNumber")
);
@computed("placement", "postNumber")
divId(placement, postNumber) {
if (postNumber) {
return `div-gpt-ad-${placement}-${postNumber}`;
} else {
return "div-gpt-ad-" + this.get("placement");
return `div-gpt-ad-${placement}`;
}
}.property("placement", "postNumber"),
},
adUnitClass: function() {
return "dfp-ad-" + this.get("placement");
}.property("placement"),
@computed("placement", "showAd")
adUnitClass(placement, showAd) {
return showAd ? `dfp-ad-${placement}` : "";
},
adWrapperStyle: function() {
return `width: ${this.get("width")}px; height: ${this.get(
"height"
)}px;`.htmlSafe();
}.property("width", "height"),
@computed("width", "height")
adWrapperStyle(w, h) {
return `width: ${w}px; height: ${h}px;`.htmlSafe();
},
adTitleStyleMobile: function() {
return `width: ${this.get("width")}px;`.htmlSafe();
}.property("width"),
@computed("width")
adTitleStyleMobile(w) {
return `width: ${w}px;`.htmlSafe();
},
showAd: function() {
@computed("showToTrustLevel", "showToGroups")
showAd(showToTrustLevel, showToGroups) {
return (
Discourse.SiteSettings.dfp_publisher_id && this.get("checkTrustLevels")
Discourse.SiteSettings.dfp_publisher_id &&
showToTrustLevel &&
showToGroups
);
}.property("checkTrustLevels"),
},
checkTrustLevels: function() {
@computed()
showToTrustLevel() {
return !(
currentUser &&
currentUser.get("trust_level") >
Discourse.SiteSettings.dfp_through_trust_level
);
}.property("trust_level"),
},
refreshAd: function() {
@observes("refreshOnChange")
refreshAd() {
var slot = ads[this.get("divId")];
if (!(slot && slot.ad)) {
return;
@@ -260,9 +271,10 @@ export default Ember.Component.extend({
window.googletag.pubads().refresh([ad]);
});
}
}.observes("refreshOnChange"),
},
_initGoogleDFP: function() {
@on("didInsertElement")
_initGoogleDFP() {
if (!this.get("showAd")) {
return;
}
@@ -287,7 +299,7 @@ export default Ember.Component.extend({
}
});
});
}.on("didInsertElement"),
},
willRender() {
this._super(...arguments);
@@ -300,7 +312,8 @@ export default Ember.Component.extend({
this.set("height", size.height);
},
cleanup: function() {
@on("willDestroyElement")
cleanup() {
destroySlot(this.get("divId"));
}.on("willDestroyElement")
}
});