nodebb-plugin-ezoic-infinite 1.6.78 → 1.6.80
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/library.js +33 -97
- package/package.json +1 -1
- package/public/client.js +167 -1448
- package/public/style.css +20 -64
package/library.js
CHANGED
|
@@ -7,124 +7,60 @@ const db = require.main.require('./src/database');
|
|
|
7
7
|
const SETTINGS_KEY = 'ezoic-infinite';
|
|
8
8
|
const plugin = {};
|
|
9
9
|
|
|
10
|
-
function normalizeExcludedGroups(value) {
|
|
11
|
-
if (!value) return [];
|
|
12
|
-
if (Array.isArray(value)) return value;
|
|
13
|
-
return String(value).split(',').map(s => s.trim()).filter(Boolean);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
function parseBool(v, def = false) {
|
|
17
|
-
if (v === undefined || v === null || v === '') return def;
|
|
18
|
-
if (typeof v === 'boolean') return v;
|
|
19
|
-
const s = String(v).toLowerCase();
|
|
20
|
-
return s === '1' || s === 'true' || s === 'on' || s === 'yes';
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
async function getAllGroups() {
|
|
24
|
-
let names = await db.getSortedSetRange('groups:createtime', 0, -1);
|
|
25
|
-
if (!names || !names.length) {
|
|
26
|
-
names = await db.getSortedSetRange('groups:visible:createtime', 0, -1);
|
|
27
|
-
}
|
|
28
|
-
const filtered = names.filter(name => !groups.isPrivilegeGroup(name));
|
|
29
|
-
const data = await groups.getGroupsData(filtered);
|
|
30
|
-
// Filter out nulls (groups deleted between the sorted-set read and getGroupsData)
|
|
31
|
-
const valid = data.filter(g => g && g.name);
|
|
32
|
-
valid.sort((a, b) => String(a.name).localeCompare(String(b.name), undefined, { sensitivity: 'base' }));
|
|
33
|
-
return valid;
|
|
34
|
-
}
|
|
35
|
-
let _settingsCache = null;
|
|
36
|
-
let _settingsCacheAt = 0;
|
|
37
|
-
const SETTINGS_TTL = 30000; // 30s
|
|
38
|
-
|
|
39
10
|
async function getSettings() {
|
|
40
|
-
|
|
41
|
-
if (_settingsCache && (now - _settingsCacheAt) < SETTINGS_TTL) return _settingsCache;
|
|
42
|
-
const s = await meta.settings.get(SETTINGS_KEY);
|
|
43
|
-
_settingsCacheAt = Date.now();
|
|
44
|
-
_settingsCache = {
|
|
45
|
-
// Between-post ads (simple blocks) in category topic list
|
|
46
|
-
enableBetweenAds: parseBool(s.enableBetweenAds, true),
|
|
47
|
-
showFirstTopicAd: parseBool(s.showFirstTopicAd, false),
|
|
48
|
-
placeholderIds: (s.placeholderIds || '').trim(),
|
|
49
|
-
intervalPosts: Math.max(1, parseInt(s.intervalPosts, 10) || 6),
|
|
50
|
-
|
|
51
|
-
// Home/categories list ads (between categories on / or /categories)
|
|
52
|
-
enableCategoryAds: parseBool(s.enableCategoryAds, false),
|
|
53
|
-
showFirstCategoryAd: parseBool(s.showFirstCategoryAd, false),
|
|
54
|
-
categoryPlaceholderIds: (s.categoryPlaceholderIds || '').trim(),
|
|
55
|
-
intervalCategories: Math.max(1, parseInt(s.intervalCategories, 10) || 4),
|
|
56
|
-
|
|
57
|
-
// "Ad message" between replies (looks like a post)
|
|
58
|
-
enableMessageAds: parseBool(s.enableMessageAds, false),
|
|
59
|
-
showFirstMessageAd: parseBool(s.showFirstMessageAd, false),
|
|
60
|
-
messagePlaceholderIds: (s.messagePlaceholderIds || '').trim(),
|
|
61
|
-
messageIntervalPosts: Math.max(1, parseInt(s.messageIntervalPosts, 10) || 3),
|
|
62
|
-
|
|
63
|
-
excludedGroups: normalizeExcludedGroups(s.excludedGroups),
|
|
64
|
-
};
|
|
65
|
-
return _settingsCache;
|
|
11
|
+
return await meta.settings.get(SETTINGS_KEY);
|
|
66
12
|
}
|
|
67
13
|
|
|
68
14
|
async function isUserExcluded(uid, excludedGroups) {
|
|
69
|
-
if (!uid || !excludedGroups
|
|
70
|
-
|
|
71
|
-
|
|
15
|
+
if (!uid || !excludedGroups) return false;
|
|
16
|
+
// Gérer le format multiple de NodeBB
|
|
17
|
+
const groupsList = Array.isArray(excludedGroups) ? excludedGroups : [excludedGroups];
|
|
18
|
+
if (!groupsList.length) return false;
|
|
19
|
+
return await groups.isMemberOfGroups(uid, groupsList);
|
|
72
20
|
}
|
|
73
21
|
|
|
74
|
-
plugin.onSettingsSet = function (data) {
|
|
75
|
-
// Invalider le cache dès que les settings de ce plugin sont sauvegardés via l'ACP
|
|
76
|
-
if (data && data.hash === SETTINGS_KEY) {
|
|
77
|
-
_settingsCache = null;
|
|
78
|
-
}
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
plugin.addAdminNavigation = async (header) => {
|
|
82
|
-
header.plugins = header.plugins || [];
|
|
83
|
-
header.plugins.push({
|
|
84
|
-
route: '/plugins/ezoic-infinite',
|
|
85
|
-
icon: 'fa-ad',
|
|
86
|
-
name: 'Ezoic Infinite Ads'
|
|
87
|
-
});
|
|
88
|
-
return header;
|
|
89
|
-
};
|
|
90
|
-
|
|
91
22
|
plugin.init = async ({ router, middleware }) => {
|
|
92
|
-
async
|
|
23
|
+
const renderAdmin = async (req, res) => {
|
|
93
24
|
const settings = await getSettings();
|
|
94
|
-
const
|
|
25
|
+
const names = await db.getSortedSetRange('groups:createtime', 0, -1);
|
|
26
|
+
const groupsData = await groups.getGroupsData(names);
|
|
27
|
+
const allGroups = groupsData.filter(g => g && g.name).map(g => ({ name: g.name }));
|
|
95
28
|
|
|
96
29
|
res.render('admin/plugins/ezoic-infinite', {
|
|
97
|
-
title: 'Ezoic Infinite Ads',
|
|
98
30
|
...settings,
|
|
99
|
-
enableBetweenAds_checked: settings.enableBetweenAds ? 'checked' : '',
|
|
100
|
-
enableMessageAds_checked: settings.enableMessageAds ? 'checked' : '',
|
|
101
31
|
allGroups,
|
|
32
|
+
enableBetweenAds_checked: settings.enableBetweenAds === 'on' ? 'checked' : '',
|
|
33
|
+
enableMessageAds_checked: settings.enableMessageAds === 'on' ? 'checked' : ''
|
|
102
34
|
});
|
|
103
|
-
}
|
|
35
|
+
};
|
|
104
36
|
|
|
105
|
-
router.get('/admin/plugins/ezoic-infinite', middleware.admin.buildHeader,
|
|
106
|
-
router.get('/api/admin/plugins/ezoic-infinite',
|
|
37
|
+
router.get('/admin/plugins/ezoic-infinite', middleware.admin.buildHeader, renderAdmin);
|
|
38
|
+
router.get('/api/admin/plugins/ezoic-infinite', renderAdmin);
|
|
107
39
|
|
|
108
40
|
router.get('/api/plugins/ezoic-infinite/config', async (req, res) => {
|
|
109
41
|
const settings = await getSettings();
|
|
110
42
|
const excluded = await isUserExcluded(req.uid, settings.excludedGroups);
|
|
111
|
-
|
|
112
43
|
res.json({
|
|
113
44
|
excluded,
|
|
114
|
-
enableBetweenAds: settings.enableBetweenAds,
|
|
115
|
-
showFirstTopicAd: settings.showFirstTopicAd,
|
|
116
|
-
placeholderIds: settings.placeholderIds,
|
|
117
|
-
intervalPosts: settings.intervalPosts,
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
enableMessageAds: settings.enableMessageAds,
|
|
123
|
-
showFirstMessageAd: settings.showFirstMessageAd,
|
|
124
|
-
messagePlaceholderIds: settings.messagePlaceholderIds,
|
|
125
|
-
messageIntervalPosts: settings.messageIntervalPosts,
|
|
45
|
+
enableBetweenAds: settings.enableBetweenAds === 'on',
|
|
46
|
+
showFirstTopicAd: settings.showFirstTopicAd === 'on',
|
|
47
|
+
placeholderIds: settings.placeholderIds || '',
|
|
48
|
+
intervalPosts: settings.intervalPosts || 10,
|
|
49
|
+
enableMessageAds: settings.enableMessageAds === 'on',
|
|
50
|
+
showFirstMessageAd: settings.showFirstMessageAd === 'on',
|
|
51
|
+
messagePlaceholderIds: settings.messagePlaceholderIds || '',
|
|
52
|
+
messageIntervalPosts: settings.messageIntervalPosts || 10,
|
|
126
53
|
});
|
|
127
54
|
});
|
|
128
55
|
};
|
|
129
56
|
|
|
130
|
-
|
|
57
|
+
plugin.addAdminNavigation = async (header) => {
|
|
58
|
+
header.plugins.push({
|
|
59
|
+
route: '/plugins/ezoic-infinite',
|
|
60
|
+
icon: 'fa-ad',
|
|
61
|
+
name: 'Ezoic Infinite'
|
|
62
|
+
});
|
|
63
|
+
return header;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
module.exports = plugin;
|