From baae33385a06b8beffe67483cd07c38232c0126c Mon Sep 17 00:00:00 2001 From: Dachi Date: Sun, 22 Sep 2024 08:17:46 -0700 Subject: [PATCH 001/121] changed the tags file completely --- src/topics/tags.js | 123 ++++++++++++++++++++++----------------------- 1 file changed, 61 insertions(+), 62 deletions(-) diff --git a/src/topics/tags.js b/src/topics/tags.js index daab4e5f77..db4ba219fb 100644 --- a/src/topics/tags.js +++ b/src/topics/tags.js @@ -19,19 +19,26 @@ const cache = require('../cache'); module.exports = function (Topics) { Topics.createTags = async function (tags, tid, timestamp) { + console.log('dcharkvi'); if (!Array.isArray(tags) || !tags.length) { return; } - const cid = await Topics.getTopicField(tid, 'cid'); - const topicSets = tags.map(tag => `tag:${tag}:topics`).concat( - tags.map(tag => `cid:${cid}:tag:${tag}:topics`) - ); + const topicSets = generateTopicSets(tags, cid); await db.sortedSetsAdd(topicSets, timestamp, tid); await Topics.updateCategoryTagsCount([cid], tags); - await Promise.all(tags.map(updateTagCount)); + await updateTagCountsForAll(tags); }; - + function generateTopicSets(tags, cid) { + console.log('dcharkvi'); + return tags.map(tag => `tag:${tag}:topics`).concat( + tags.map(tag => `cid:${cid}:tag:${tag}:topics`) + ); + } + async function updateTagCountsForAll(tags) { + console.log('dcharkvi'); + await Promise.all(tags.map(updateTagCount)); + } Topics.filterTags = async function (tags, cid) { const result = await plugins.hooks.fire('filter:tags.filter', { tags: tags, cid: cid }); tags = _.uniq(result.tags) @@ -65,36 +72,41 @@ module.exports = function (Topics) { cids.map(cid => `cid:${cid}:tags`), '-inf', 0 ); }; - Topics.validateTags = async function (tags, cid, uid, tid = null) { + console.log('dcharkvi'); if (!Array.isArray(tags)) { throw new Error('[[error:invalid-data]]'); } tags = _.uniq(tags); - const [categoryData, isPrivileged, currentTags] = await Promise.all([ + const [categoryData, isPrivileged, currentTags] = await getValidationData(tags, cid, uid, tid); + validateTagCount(tags, categoryData); + await validateSystemTags(tags, currentTags, isPrivileged); + }; + async function getValidationData(tags, cid, uid, tid) { + return await Promise.all([ categories.getCategoryFields(cid, ['minTags', 'maxTags']), user.isPrivileged(uid), tid ? Topics.getTopicTags(tid) : [], ]); + } + function validateTagCount(tags, categoryData) { if (tags.length < parseInt(categoryData.minTags, 10)) { throw new Error(`[[error:not-enough-tags, ${categoryData.minTags}]]`); } else if (tags.length > parseInt(categoryData.maxTags, 10)) { throw new Error(`[[error:too-many-tags, ${categoryData.maxTags}]]`); } - + } + async function validateSystemTags(tags, currentTags, isPrivileged) { const addedTags = tags.filter(tag => !currentTags.includes(tag)); const removedTags = currentTags.filter(tag => !tags.includes(tag)); - const systemTags = (meta.config.systemTags || '').split(','); - - if (!isPrivileged && systemTags.length && addedTags.length && addedTags.some(tag => systemTags.includes(tag))) { + const systemTags = (meta.config.systemTags || '').split(',').map(tag => tag.trim()).filter(Boolean); + if (!isPrivileged && systemTags.length && addedTags.some(tag => systemTags.includes(tag))) { throw new Error('[[error:cant-use-system-tag]]'); } - - if (!isPrivileged && systemTags.length && removedTags.length && removedTags.some(tag => systemTags.includes(tag))) { + if (!isPrivileged && systemTags.length && removedTags.some(tag => systemTags.includes(tag))) { throw new Error('[[error:cant-remove-system-tag]]'); } - }; - + } async function filterCategoryTags(tags, cid) { const tagWhitelist = await categories.getTagWhitelist([cid]); if (!Array.isArray(tagWhitelist[0]) || !tagWhitelist[0].length) { @@ -103,7 +115,6 @@ module.exports = function (Topics) { const whitelistSet = new Set(tagWhitelist[0]); return tags.filter(tag => whitelistSet.has(tag)); } - Topics.createEmptyTag = async function (tag) { if (!tag) { throw new Error('[[error:invalid-tag]]'); @@ -124,67 +135,55 @@ module.exports = function (Topics) { .map(cid => ([`cid:${cid}:tags`, 0, tag])); await db.sortedSetAddBulk(bulkAdd); }; - Topics.renameTags = async function (data) { - for (const tagData of data) { - // eslint-disable-next-line no-await-in-loop - await renameTag(tagData.value, tagData.newName); - } + console.log('dcharkvi'); + await Promise.all(data.map(tagData => renameTag(tagData.value, tagData.newName))); }; - async function renameTag(tag, newTagName) { + console.log('dcharkvi'); if (!newTagName || tag === newTagName) { return; } newTagName = utils.cleanUpTag(newTagName, meta.config.maximumTagLength); - await Topics.createEmptyTag(newTagName); + const allCids = await processTagForAllTids(tag, newTagName); + await Topics.updateCategoryTagsCount(Object.keys(allCids), [newTagName]); + await updateTagCount(newTagName); + } + async function processTagForAllTids(tag, newTagName) { const allCids = {}; - await batch.processSortedSet(`tag:${tag}:topics`, async (tids) => { const topicData = await Topics.getTopicsFields(tids, ['tid', 'cid', 'tags']); const cids = topicData.map(t => t.cid); topicData.forEach((t) => { allCids[t.cid] = true; }); const scores = await db.sortedSetScores(`tag:${tag}:topics`, tids); - // update tag::topics - await db.sortedSetAdd(`tag:${newTagName}:topics`, scores, tids); - await db.sortedSetRemove(`tag:${tag}:topics`, tids); - - // update cid::tag::topics - await db.sortedSetAddBulk(topicData.map( - (t, index) => [`cid:${t.cid}:tag:${newTagName}:topics`, scores[index], t.tid] - )); - await db.sortedSetRemove(cids.map(cid => `cid:${cid}:tag:${tag}:topics`), tids); - - // update 'tags' field in topic hash - topicData.forEach((topic) => { - topic.tags = topic.tags.map(tagItem => tagItem.value); - const index = topic.tags.indexOf(tag); - if (index !== -1) { - topic.tags.splice(index, 1, newTagName); - } - }); - await db.setObjectBulk( - topicData.map(t => [`topic:${t.tid}`, { tags: t.tags.join(',') }]), - ); + await updateTagTopics(newTagName, tag, scores, tids, topicData, cids); }, {}); - const followers = await db.getSortedSetRangeWithScores(`tag:${tag}:followers`, 0, -1); - if (followers.length) { - const userKeys = followers.map(item => `uid:${item.value}:followed_tags`); - const scores = await db.sortedSetsScore(userKeys, tag); - await db.sortedSetsRemove(userKeys, tag); - await db.sortedSetsAdd(userKeys, scores, newTagName); - await db.sortedSetAdd( - `tag:${newTagName}:followers`, - followers.map(item => item.score), - followers.map(item => item.value), - ); - } - await Topics.deleteTag(tag); - await updateTagCount(newTagName); - await Topics.updateCategoryTagsCount(Object.keys(allCids), [newTagName]); + return allCids; + } + async function updateTagTopics(newTagName, tag, scores, tids, topicData, cids) { + await db.sortedSetAdd(`tag:${newTagName}:topics`, scores, tids); + await db.sortedSetRemove(`tag:${tag}:topics`, tids); + // Update cid::tag::topics + await db.sortedSetAddBulk(topicData.map( + (t, index) => [`cid:${t.cid}:tag:${newTagName}:topics`, scores[index], t.tid] + )); + await db.sortedSetRemove(cids.map(cid => `cid:${cid}:tag:${tag}:topics`), tids); + // Update 'tags' field in topic hash + await updateTopicHashTags(tids, topicData, tag, newTagName); + } + async function updateTopicHashTags(tids, topicData, oldTag, newTag) { + topicData.forEach((topic) => { + topic.tags = topic.tags.map(tagItem => tagItem.value); + const index = topic.tags.indexOf(oldTag); + if (index !== -1) { + topic.tags.splice(index, 1, newTag); + } + }); + await db.setObjectBulk( + topicData.map(t => [`topic:${t.tid}`, { tags: t.tags.join(',') }]), + ); } - async function updateTagCount(tag) { const count = await Topics.getTagTopicCount(tag); await db.sortedSetAdd('tags:topic:count', count || 0, tag); From 265558ec2122e07b43cd7633e82376734f4f288c Mon Sep 17 00:00:00 2001 From: NickDevi Date: Sun, 22 Sep 2024 18:27:15 +0300 Subject: [PATCH 002/121] modifiedTheFileFromPRoject1 --- src/topics/sorted.js | 163 +++++++++++++++++++++++-------------------- 1 file changed, 87 insertions(+), 76 deletions(-) diff --git a/src/topics/sorted.js b/src/topics/sorted.js index 98292f0ddb..bceda88015 100644 --- a/src/topics/sorted.js +++ b/src/topics/sorted.js @@ -11,13 +11,23 @@ const meta = require('../meta'); const plugins = require('../plugins'); module.exports = function (Topics) { + console.log('ndevidze'); Topics.getSortedTopics = async function (params) { const data = { nextStart: 0, topicCount: 0, topics: [], }; - + params = initializeParams(params); + data.tids = await getTids(params); + data.tids = await sortTids(data.tids, params); + data.tids = await filterTids(data.tids.slice(0, meta.config.recentMaxTopics), params); + data.topicCount = data.tids.length; + data.topics = await getTopics(data.tids, params); + data.nextStart = params.stop + 1; + return data; + }; + function initializeParams(params) { params.term = params.term || 'alltime'; params.sort = params.sort || 'recent'; params.query = params.query || {}; @@ -28,15 +38,8 @@ module.exports = function (Topics) { if (params.tags && !Array.isArray(params.tags)) { params.tags = [params.tags]; } - data.tids = await getTids(params); - data.tids = await sortTids(data.tids, params); - data.tids = await filterTids(data.tids.slice(0, meta.config.recentMaxTopics), params); - data.topicCount = data.tids.length; - data.topics = await getTopics(data.tids, params); - data.nextStart = params.stop + 1; - return data; - }; - + return params; + } async function getTids(params) { if (plugins.hooks.hasListeners('filter:topics.getSortedTids')) { const result = await plugins.hooks.fire('filter:topics.getSortedTids', { params: params, tids: [] }); @@ -137,69 +140,80 @@ module.exports = function (Topics) { } async function getCidTids(params) { + console.log('getting Tids'); if (params.tags.length) { - return _.intersection(...await Promise.all(params.tags.map(async (tag) => { - const sets = params.cids.map(cid => `cid:${cid}:tag:${tag}:topics`); - return await db.getSortedSetRevRange(sets, 0, -1); - }))); + return await getTidsForTagsAndCids(params); } - + const sets = getCidSets(params.cids, params.sort); + let pinnedTids = await db.getSortedSetRevRange(sets.pinnedSets, 0, -1); + pinnedTids = await Topics.tools.checkPinExpiry(pinnedTids); + const tids = await db[sets.method](sets.normalSets, 0, meta.config.recentMaxTopics - 1); + return pinnedTids.concat(tids); + } + function getCidSets(cids, sort) { const sets = []; const pinnedSets = []; - params.cids.forEach((cid) => { - if (params.sort === 'recent' || params.sort === 'old') { + cids.forEach((cid) => { + if (sort === 'recent' || sort === 'old') { sets.push(`cid:${cid}:tids`); } else { - sets.push(`cid:${cid}:tids${params.sort ? `:${params.sort}` : ''}`); + sets.push(`cid:${cid}:tids${sort ? `:${sort}` : ''}`); } pinnedSets.push(`cid:${cid}:tids:pinned`); }); - let pinnedTids = await db.getSortedSetRevRange(pinnedSets, 0, -1); - pinnedTids = await Topics.tools.checkPinExpiry(pinnedTids); - const method = params.sort === 'old' ? - 'getSortedSetRange' : - 'getSortedSetRevRange'; - const tids = await db[method](sets, 0, meta.config.recentMaxTopics - 1); - return pinnedTids.concat(tids); + const method = (sort === 'old') ? 'getSortedSetRange' : 'getSortedSetRevRange'; + return { normalSets: sets, pinnedSets: pinnedSets, method: method }; + } + async function getTidsForTagsAndCids(params) { + return _.intersection( + ...await Promise.all(params.tags.map(async (tag) => { + const sets = params.cids.map(cid => `cid:${cid}:tag:${tag}:topics`); + return await db.getSortedSetRevRange(sets, 0, -1); + })) + ); } async function sortTids(tids, params) { - if (params.term === 'alltime' && !params.cids && !params.tags.length && params.filter !== 'watched' && !params.floatPinned) { + console.log('sorting Tids'); + if (canSkipSorting(params)) { return tids; } - if (params.sort === 'posts' && params.term !== 'alltime') { return tids; } - const { sortMap, fields } = await plugins.hooks.fire('filter:topics.sortOptions', { params, - fields: [ - 'tid', 'timestamp', 'lastposttime', 'upvotes', 'downvotes', 'postcount', 'pinned', - ], - sortMap: { - recent: sortRecent, - old: sortOld, - create: sortCreate, - posts: sortPopular, - votes: sortVotes, - views: sortViews, - }, + fields: getFields(), + sortMap: getSortMap(), }); - const topicData = await Topics.getTopicsFields(tids, fields); - const sortFn = sortMap.hasOwnProperty(params.sort) && sortMap[params.sort] ? - sortMap[params.sort] : sortRecent; - + const sortFn = getSortFunction(params.sort, sortMap); if (params.floatPinned) { floatPinned(topicData, sortFn); } else { topicData.sort(sortFn); } - return topicData.map(topic => topic && topic.tid); } - + function canSkipSorting(params) { + return params.term === 'alltime' && !params.cids && !params.tags.length && params.filter !== 'watched' && !params.floatPinned; + } + function getFields() { + return ['tid', 'timestamp', 'lastposttime', 'upvotes', 'downvotes', 'postcount', 'pinned']; + } + function getSortMap() { + return { + recent: sortRecent, + old: sortOld, + create: sortCreate, + posts: sortPopular, + votes: sortVotes, + views: sortViews, + }; + } + function getSortFunction(sort, sortMap) { + return sortMap.hasOwnProperty(sort) && sortMap[sort] ? sortMap[sort] : sortRecent; + } function floatPinned(topicData, sortFn) { topicData.sort((a, b) => (a.pinned !== b.pinned ? b.pinned - a.pinned : sortFn(a, b))); } @@ -235,49 +249,46 @@ module.exports = function (Topics) { } async function filterTids(tids, params) { - const { filter } = params; - const { uid } = params; - - if (filter === 'new') { - tids = await Topics.filterNewTids(tids, uid); - } else if (filter === 'unreplied') { - tids = await Topics.filterUnrepliedTids(tids); - } else { - tids = await Topics.filterNotIgnoredTids(tids, uid); - } - - tids = await privileges.topics.filterTids('topics:read', tids, uid); - let topicData = await Topics.getTopicsFields(tids, ['uid', 'tid', 'cid', 'tags']); + console.log('filtering Tids'); + tids = await applyFilterByType(tids, params); + tids = await privileges.topics.filterTids('topics:read', tids, params.uid); + const topicData = await Topics.getTopicsFields(tids, ['uid', 'tid', 'cid', 'tags']); const topicCids = _.uniq(topicData.map(topic => topic.cid)).filter(Boolean); - - async function getIgnoredCids() { - if (params.cids || filter === 'watched' || meta.config.disableRecentCategoryFilter) { - return []; - } - return await categories.isIgnored(topicCids, uid); - } const [ignoredCids, filtered] = await Promise.all([ - getIgnoredCids(), - user.blocks.filter(uid, topicData), + getIgnoredCids(params, topicCids), + user.blocks.filter(params.uid, topicData), ]); - - const isCidIgnored = _.zipObject(topicCids, ignoredCids); - topicData = filtered; - + return filterTopicsByCidsAndTags(filtered, ignoredCids, params); + } + async function applyFilterByType(tids, params) { + switch (params.filter) { + case 'new': + return await Topics.filterNewTids(tids, params.uid); + case 'unreplied': + return await Topics.filterUnrepliedTids(tids); + default: + return await Topics.filterNotIgnoredTids(tids, params.uid); + } + } + async function getIgnoredCids(params, topicCids) { + if (params.cids || params.filter === 'watched' || meta.config.disableRecentCategoryFilter) { + return []; + } + return await categories.isIgnored(topicCids, params.uid); + } + function filterTopicsByCidsAndTags(topicData, ignoredCids, params) { + const isCidIgnored = _.zipObject(topicData.map(t => t.cid), ignoredCids); const cids = params.cids && params.cids.map(String); const { tags } = params; - tids = topicData.filter(t => ( + const tids = topicData.filter(t => ( t && t.cid && !isCidIgnored[t.cid] && (!cids || cids.includes(String(t.cid))) && (!tags.length || tags.every(tag => t.tags.find(topicTag => topicTag.value === tag))) )).map(t => t.tid); - - const result = await plugins.hooks.fire('filter:topics.filterSortedTids', { tids: tids, params: params }); - return result.tids; + return plugins.hooks.fire('filter:topics.filterSortedTids', { tids, params }).then(result => result.tids); } - async function getTopics(tids, params) { tids = tids.slice(params.start, params.stop !== -1 ? params.stop + 1 : undefined); const topicData = await Topics.getTopicsByTids(tids, params); From 943a81dff7528c5378630c1aff36459cd7bcbe42 Mon Sep 17 00:00:00 2001 From: Seckhen Date: Sun, 22 Sep 2024 18:45:14 +0300 Subject: [PATCH 003/121] modified-same-file-from-project-one-to-match-it-in-swifties --- src/upgrades/1.4.4/sound_settings.js | 111 +++++++++++++++------------ 1 file changed, 61 insertions(+), 50 deletions(-) diff --git a/src/upgrades/1.4.4/sound_settings.js b/src/upgrades/1.4.4/sound_settings.js index ae0a6d8fa3..74e82c37bc 100644 --- a/src/upgrades/1.4.4/sound_settings.js +++ b/src/upgrades/1.4.4/sound_settings.js @@ -1,65 +1,76 @@ -'use strict'; const async = require('async'); const db = require('../../database'); +const meta = require('../../meta'); +const batch = require('../../batch'); +const soundMap = { + 'notification.mp3': 'Default | Deedle-dum', + 'waterdrop-high.mp3': 'Default | Water drop (high)', + 'waterdrop-low.mp3': 'Default | Water drop (low)', +}; -module.exports = { - name: 'Update global and user sound settings', - timestamp: Date.UTC(2017, 1, 25), - method: function (callback) { - const meta = require('../../meta'); - const batch = require('../../batch'); +function updateGlobalSoundSettings(callback) { + console.log('Seckhen Ariel Andrade Cuellar'); + const keys = ['chat-incoming', 'chat-outgoing', 'notification']; + db.getObject('settings:sounds', (err, settings) => { + if (err || !settings) { + return callback(err); + } - const map = { - 'notification.mp3': 'Default | Deedle-dum', - 'waterdrop-high.mp3': 'Default | Water drop (high)', - 'waterdrop-low.mp3': 'Default | Water drop (low)', - }; + const updatedSettings = keys.reduce((acc, key) => { + if (settings[key] && !settings[key].includes(' | ')) { + acc[key] = soundMap[settings[key]] || ''; + } + return acc; + }, {}); - async.parallel([ - function (cb) { - const keys = ['chat-incoming', 'chat-outgoing', 'notification']; + meta.configs.setMultiple(updatedSettings, callback); + }); +} + +function updateUserSoundSettings(callback) { + console.log('Seckhen Ariel Andrade Cuellar'); - db.getObject('settings:sounds', (err, settings) => { - if (err || !settings) { - return cb(err); - } + const keys = ['notificationSound', 'incomingChatSound', 'outgoingChatSound']; - keys.forEach((key) => { - if (settings[key] && !settings[key].includes(' | ')) { - settings[key] = map[settings[key]] || ''; - } - }); + batch.processSortedSet('users:joindate', processUserBatch, callback); - meta.configs.setMultiple(settings, cb); - }); - }, - function (cb) { - const keys = ['notificationSound', 'incomingChatSound', 'outgoingChatSound']; + function processUserBatch(ids, next) { + console.log('Seckhen Ariel Andrade Cuellar'); + async.each(ids, updateUserSettings, next); + } - batch.processSortedSet('users:joindate', (ids, next) => { - async.each(ids, (uid, next) => { - db.getObject(`user:${uid}:settings`, (err, settings) => { - if (err || !settings) { - return next(err); - } - const newSettings = {}; - keys.forEach((key) => { - if (settings[key] && !settings[key].includes(' | ')) { - newSettings[key] = map[settings[key]] || ''; - } - }); + function updateUserSettings(uid, next) { + console.log('Seckhen Ariel Andrade Cuellar'); + db.getObject(`user:${uid}:settings`, (err, settings) => { + if (err || !settings) { + return next(err); + } - if (Object.keys(newSettings).length) { - db.setObject(`user:${uid}:settings`, newSettings, next); - } else { - setImmediate(next); - } - }); - }, next); - }, cb); - }, + const newSettings = keys.reduce((acc, key) => { + if (settings[key] && !settings[key].includes(' | ')) { + acc[key] = soundMap[settings[key]] || ''; + } + return acc; + }, {}); + + if (Object.keys(newSettings).length) { + db.setObject(`user:${uid}:settings`, newSettings, next); + } else { + setImmediate(next); + } + }); + } +} + +module.exports = { + name: 'Update global and user sound settings', + timestamp: Date.UTC(2017, 1, 25), + method: function (callback) { + async.parallel([ + updateGlobalSoundSettings, + updateUserSoundSettings, ], callback); }, }; From 35e16566d1ba8401dac8a7b7856395bce94ddd01 Mon Sep 17 00:00:00 2001 From: Seckhen Date: Sun, 22 Sep 2024 18:52:41 +0300 Subject: [PATCH 004/121] added-missing-use-strict-line --- src/upgrades/1.4.4/sound_settings.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/upgrades/1.4.4/sound_settings.js b/src/upgrades/1.4.4/sound_settings.js index 74e82c37bc..dcd857d246 100644 --- a/src/upgrades/1.4.4/sound_settings.js +++ b/src/upgrades/1.4.4/sound_settings.js @@ -1,3 +1,4 @@ +'use strict'; const async = require('async'); const db = require('../../database'); From f09d42726d17552367324e99b7b657ed705a8383 Mon Sep 17 00:00:00 2001 From: Seckhen Date: Mon, 23 Sep 2024 20:19:05 +0300 Subject: [PATCH 005/121] Added voice recording button to new post menu, modified file composer-formatting.tpl --- dump.rdb | Bin 0 -> 135546 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 dump.rdb diff --git a/dump.rdb b/dump.rdb new file mode 100644 index 0000000000000000000000000000000000000000..b0c6beb9aa94c54ca2eb9d7a1809367bb8479ae7 GIT binary patch literal 135546 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 literal 0 HcmV?d00001 From ab689afd38eb0221679a174a9cc11178229a8e91 Mon Sep 17 00:00:00 2001 From: Ghani Date: Thu, 26 Sep 2024 00:16:25 +0300 Subject: [PATCH 006/121] replicated project1 changes here too --- src/upgrades/1.1.1/upload_privileges.js | 85 ++++++++++++++++++------- 1 file changed, 62 insertions(+), 23 deletions(-) diff --git a/src/upgrades/1.1.1/upload_privileges.js b/src/upgrades/1.1.1/upload_privileges.js index d343f4ebfa..dc3529079a 100644 --- a/src/upgrades/1.1.1/upload_privileges.js +++ b/src/upgrades/1.1.1/upload_privileges.js @@ -1,38 +1,77 @@ 'use strict'; -const async = require('async'); const db = require('../../database'); - module.exports = { name: 'Giving upload privileges', timestamp: Date.UTC(2016, 6, 12), - method: function (callback) { + method: async function () { + console.log('graissov: Executing method function'); const privilegesAPI = require('../../privileges'); const meta = require('../../meta'); + const cids = await getCategoryIds(); + await processCategories(cids, privilegesAPI, meta); + }, +}; + +// Helper function to get category IDs +function getCategoryIds() { + console.log('graissov: Executing getCategoryIds function'); + return new Promise((resolve, reject) => { db.getSortedSetRange('categories:cid', 0, -1, (err, cids) => { if (err) { - return callback(err); + return reject(err); } + resolve(cids); + }); + }); +} + +// Helper function to process each category +async function processCategories(cids, privilegesAPI, meta) { + console.log('graissov: Executing processCategories function'); + await Promise.all(cids.map(async (cid) => { + const data = await getCategoryData(cid, privilegesAPI); + await processGroups(data.groups, cid, privilegesAPI, meta); + })); +} - async.eachSeries(cids, (cid, next) => { - privilegesAPI.categories.list(cid, (err, data) => { - if (err) { - return next(err); - } - async.eachSeries(data.groups, (group, next) => { - if (group.name === 'guests' && parseInt(meta.config.allowGuestUploads, 10) !== 1) { - return next(); - } - if (group.privileges['groups:read']) { - privilegesAPI.categories.give(['upload:post:image'], cid, group.name, next); - } else { - next(); - } - }, next); - }); - }, callback); +// Helper function to get category data +function getCategoryData(cid, privilegesAPI) { + console.log('graissov: Executing getCategoryData function'); + return new Promise((resolve, reject) => { + privilegesAPI.categories.list(cid, (err, data) => { + if (err) { + return reject(err); + } + resolve(data); }); - }, -}; + }); +} + +// Helper function to process groups within a category +async function processGroups(groups, cid, privilegesAPI, meta) { + console.log('graissov: Executing processGroups function'); + await Promise.all(groups.map(async (group) => { + if (group.name === 'guests' && parseInt(meta.config.allowGuestUploads, 10) !== 1) { + return; // Skip guests if uploads are not allowed + } + if (group.privileges['groups:read']) { + await giveUploadPrivilege(cid, group.name, privilegesAPI); + } + })); +} + +// Helper function to give upload privileges +function giveUploadPrivilege(cid, groupName, privilegesAPI) { + console.log('graissov: Executing giveUploadPrivilege function'); + return new Promise((resolve, reject) => { + privilegesAPI.categories.give(['upload:post:image'], cid, groupName, (err) => { + if (err) { + return reject(err); + } + resolve(); + }); + }); +} From 8b57be8c3ba7ec520330b79df6a2645bf9fe6e01 Mon Sep 17 00:00:00 2001 From: Seckhen Date: Thu, 26 Sep 2024 01:01:46 +0300 Subject: [PATCH 007/121] Adding node modules file, which we will work on but is currently not in repository --- .gitignore | 3 ++- dump.rdb | Bin 135546 -> 159585 bytes 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 42a1b3c705..46a37deecc 100644 --- a/.gitignore +++ b/.gitignore @@ -72,4 +72,5 @@ link-plugins.sh test.sh .docker/** -!**/.gitkeep \ No newline at end of file +!**/.gitkeep +!node_modules\nodebb-theme-harmony\templates\partials\topics_list.tpl \ No newline at end of file diff --git a/dump.rdb b/dump.rdb index b0c6beb9aa94c54ca2eb9d7a1809367bb8479ae7..c11568911595e430efd75d61c22730d475453983 100644 GIT binary patch delta 26085 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 From c6595804ced7fc2bf827b5c6ea28e3e64be31716 Mon Sep 17 00:00:00 2001 From: Seckhen Date: Thu, 26 Sep 2024 01:07:38 +0300 Subject: [PATCH 008/121] Adding node modules file, which we will work on but is currently not in repository --- .gitignore | 3 +++ dump.rdb | Bin 159585 -> 159585 bytes 2 files changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 46a37deecc..2e39c6b113 100644 --- a/.gitignore +++ b/.gitignore @@ -73,4 +73,7 @@ test.sh .docker/** !**/.gitkeep +!node_modules\nodebb-theme-harmony\ +!node_modules\nodebb-theme-harmony\templates\ +!node_modules\nodebb-theme-harmony\templates\partials\ !node_modules\nodebb-theme-harmony\templates\partials\topics_list.tpl \ No newline at end of file diff --git a/dump.rdb b/dump.rdb index c11568911595e430efd75d61c22730d475453983..c71ec0a686aaf28ee9f0ee9fb215df0b73a21129 100644 GIT binary patch delta 56 zcmV-80LTB~-U;E}36L=nrHJ%q`UrJ%Wn?XFWo^O$Jh4K*R0G8)|APcohXhptw**xJ ORT>Bpj3fjpsLSWZ78Z#B delta 56 zcmV-80LTB~-U;E}36L=nlzQ}L`UrJ%Wn?XFWo^Q6;ITr#R0Dy+{(}TnhXhptw**xJ ORT>CrnYJp@ys%;OeHjb@ From 9478b3b526967595dec212a8aea53eaf5b877442 Mon Sep 17 00:00:00 2001 From: Seckhen Date: Thu, 26 Sep 2024 01:33:16 +0300 Subject: [PATCH 009/121] Adding node modules file in a newly created folder called node_modules_real because node_modules files can't be pushed and updated READ ME with instructions --- README.md | 11 ++ .../templates/partials/topics_list.tpl | 131 ++++++++++++++++++ node_modules_real/topics_list.tpl | 131 ++++++++++++++++++ 3 files changed, 273 insertions(+) create mode 100644 node_modules/nodebb-theme-harmony/templates/partials/topics_list.tpl create mode 100644 node_modules_real/topics_list.tpl diff --git a/README.md b/README.md index 6ef180f625..ef1ac825d7 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,17 @@ [![Coverage Status](https://coveralls.io/repos/github/CMU-313/NodeBB/badge.svg)](https://coveralls.io/github/CMU-313/NodeBB) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=CMU-313_NodeBB&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=CMU-313_NodeBB) + +****************************************** NOTICE ************************************************ + +The collaborators on this project are Seckhen Andrade, Nikoloz Devidze, Ghani Raissov, Davit Charkviani, Yousuf Alkhiyami + +Please know that there is a folder called node_module_real, which contains the files that are modified compared to the files that are in the node_modules we get by npm install. Please take the code from the files in the node_modules_real folder (files have the same names as in the node_module generated by npm install) and paste (replace the code) them in the respective files. + + +*************************************************************************************************** + + [**NodeBB Forum Software**](https://nodebb.org) is powered by Node.js and supports either Redis, MongoDB, or a PostgreSQL database. It utilizes web sockets for instant interactions and real-time notifications. NodeBB takes the best of the modern web: real-time streaming discussions, mobile responsiveness, and rich RESTful read/write APIs, while staying true to the original bulletin board/forum format → categorical hierarchies, local user accounts, and asynchronous messaging. NodeBB by itself contains a "common core" of basic functionality, while additional functionality and integrations are enabled through the use of third-party plugins. diff --git a/node_modules/nodebb-theme-harmony/templates/partials/topics_list.tpl b/node_modules/nodebb-theme-harmony/templates/partials/topics_list.tpl new file mode 100644 index 0000000000..7b26d21f0e --- /dev/null +++ b/node_modules/nodebb-theme-harmony/templates/partials/topics_list.tpl @@ -0,0 +1,131 @@ +
    + + {{{ each topics }}} +
  • > + + + + + + +
    +
    + + {buildAvatar(./user, "40px", true, "avatar avatar-tooltip")} + + {{{ if showSelect }}} +
    + +
    + {{{ end }}} +
    +
    +

    + {./title} +

    + + + + [[topic:watching]] + + + + [[topic:ignoring]] + + + + [[topic:scheduled]] + + + + {{{ if !./pinExpiry }}}[[topic:pinned]]{{{ else }}}[[topic:pinned-with-expiry, {isoTimeToLocaleString(./pinExpiryISO, config.userLang)}]]{{{ end }}} + + + + [[topic:locked]] + + + + [[topic:moved]] + + {{{each ./icons}}}{@value}{{{end}}} + + {{{ if !template.category }}} + {function.buildCategoryLabel, ./category, "a", "border"} + {{{ end }}} + + + +
    + + + {humanReadableNumber(./postcount, 0)} + + + +
    + + +
    + {{{ if showSelect }}} +
    + +
    + {{{ end }}} +
    + {{{ if ./thumbs.length }}} + + + +{increment(./thumbs.length, "-1")} + + {{{ end }}} +
    + +
    +
    + {{{ if !reputation:disabled }}} +
    + {humanReadableNumber(./votes, 0)} + [[global:votes]] + +
    + {{{ end }}} +
    + {humanReadableNumber(./postcount, 0)} + [[global:posts]] + +
    +
    + {humanReadableNumber(./viewcount, 0)} + [[global:views]] + +
    +
    +
    +
    + {{{ if ./unreplied }}} +
    + [[category:no-replies]] +
    + {{{ else }}} + {{{ if ./teaser.pid }}} + +
    + + {./teaser.content} +
    + {{{ end }}} + {{{ end }}} +
    +
    +
    +
  • + {{{end}}} +
diff --git a/node_modules_real/topics_list.tpl b/node_modules_real/topics_list.tpl new file mode 100644 index 0000000000..7b26d21f0e --- /dev/null +++ b/node_modules_real/topics_list.tpl @@ -0,0 +1,131 @@ +
    + + {{{ each topics }}} +
  • > + + + + + + +
    +
    + + {buildAvatar(./user, "40px", true, "avatar avatar-tooltip")} + + {{{ if showSelect }}} +
    + +
    + {{{ end }}} +
    +
    +

    + {./title} +

    + + + + [[topic:watching]] + + + + [[topic:ignoring]] + + + + [[topic:scheduled]] + + + + {{{ if !./pinExpiry }}}[[topic:pinned]]{{{ else }}}[[topic:pinned-with-expiry, {isoTimeToLocaleString(./pinExpiryISO, config.userLang)}]]{{{ end }}} + + + + [[topic:locked]] + + + + [[topic:moved]] + + {{{each ./icons}}}{@value}{{{end}}} + + {{{ if !template.category }}} + {function.buildCategoryLabel, ./category, "a", "border"} + {{{ end }}} + + + +
    + + + {humanReadableNumber(./postcount, 0)} + + + +
    + + +
    + {{{ if showSelect }}} +
    + +
    + {{{ end }}} +
    + {{{ if ./thumbs.length }}} + + + +{increment(./thumbs.length, "-1")} + + {{{ end }}} +
    + +
    +
    + {{{ if !reputation:disabled }}} +
    + {humanReadableNumber(./votes, 0)} + [[global:votes]] + +
    + {{{ end }}} +
    + {humanReadableNumber(./postcount, 0)} + [[global:posts]] + +
    +
    + {humanReadableNumber(./viewcount, 0)} + [[global:views]] + +
    +
    +
    +
    + {{{ if ./unreplied }}} +
    + [[category:no-replies]] +
    + {{{ else }}} + {{{ if ./teaser.pid }}} + +
    + + {./teaser.content} +
    + {{{ end }}} + {{{ end }}} +
    +
    +
    +
  • + {{{end}}} +
From 8b13e600308b4cd14eea07cd50c472dde6fff841 Mon Sep 17 00:00:00 2001 From: Seckhen Date: Thu, 26 Sep 2024 01:33:44 +0300 Subject: [PATCH 010/121] Adding node modules file in a newly created folder called node_modules_real because node_modules files can't be pushed and updated READ ME with instructions --- .gitignore | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 2e39c6b113..42a1b3c705 100644 --- a/.gitignore +++ b/.gitignore @@ -72,8 +72,4 @@ link-plugins.sh test.sh .docker/** -!**/.gitkeep -!node_modules\nodebb-theme-harmony\ -!node_modules\nodebb-theme-harmony\templates\ -!node_modules\nodebb-theme-harmony\templates\partials\ -!node_modules\nodebb-theme-harmony\templates\partials\topics_list.tpl \ No newline at end of file +!**/.gitkeep \ No newline at end of file From bee5c4c8bb626384abba5bcd30b76080d471fcee Mon Sep 17 00:00:00 2001 From: Seckhen <111176979+Seckhen@users.noreply.github.com> Date: Thu, 26 Sep 2024 01:37:47 +0300 Subject: [PATCH 011/121] Delete node_modules/nodebb-theme-harmony/templates/partials/topics_list.tpl This file occurred as an extra one as a result of testing of how we could potentially keep some of the node module files in git. Unsuccessful so this can be ignored. --- .../templates/partials/topics_list.tpl | 131 ------------------ 1 file changed, 131 deletions(-) delete mode 100644 node_modules/nodebb-theme-harmony/templates/partials/topics_list.tpl diff --git a/node_modules/nodebb-theme-harmony/templates/partials/topics_list.tpl b/node_modules/nodebb-theme-harmony/templates/partials/topics_list.tpl deleted file mode 100644 index 7b26d21f0e..0000000000 --- a/node_modules/nodebb-theme-harmony/templates/partials/topics_list.tpl +++ /dev/null @@ -1,131 +0,0 @@ -
    - - {{{ each topics }}} -
  • > - - - - - - -
    -
    - - {buildAvatar(./user, "40px", true, "avatar avatar-tooltip")} - - {{{ if showSelect }}} -
    - -
    - {{{ end }}} -
    -
    -

    - {./title} -

    - - - - [[topic:watching]] - - - - [[topic:ignoring]] - - - - [[topic:scheduled]] - - - - {{{ if !./pinExpiry }}}[[topic:pinned]]{{{ else }}}[[topic:pinned-with-expiry, {isoTimeToLocaleString(./pinExpiryISO, config.userLang)}]]{{{ end }}} - - - - [[topic:locked]] - - - - [[topic:moved]] - - {{{each ./icons}}}{@value}{{{end}}} - - {{{ if !template.category }}} - {function.buildCategoryLabel, ./category, "a", "border"} - {{{ end }}} - - - -
    - - - {humanReadableNumber(./postcount, 0)} - - - -
    - - -
    - {{{ if showSelect }}} -
    - -
    - {{{ end }}} -
    - {{{ if ./thumbs.length }}} - - - +{increment(./thumbs.length, "-1")} - - {{{ end }}} -
    - -
    -
    - {{{ if !reputation:disabled }}} -
    - {humanReadableNumber(./votes, 0)} - [[global:votes]] - -
    - {{{ end }}} -
    - {humanReadableNumber(./postcount, 0)} - [[global:posts]] - -
    -
    - {humanReadableNumber(./viewcount, 0)} - [[global:views]] - -
    -
    -
    -
    - {{{ if ./unreplied }}} -
    - [[category:no-replies]] -
    - {{{ else }}} - {{{ if ./teaser.pid }}} - -
    - - {./teaser.content} -
    - {{{ end }}} - {{{ end }}} -
    -
    -
    -
  • - {{{end}}} -
From 33b0417d1d9efe506368b679356955c084f3e1d7 Mon Sep 17 00:00:00 2001 From: Dachi Date: Wed, 25 Sep 2024 16:04:12 -0700 Subject: [PATCH 012/121] added 'share post to chat' button to every topic listing/post' --- node_modules_real/topics_list.tpl | 139 ++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 node_modules_real/topics_list.tpl diff --git a/node_modules_real/topics_list.tpl b/node_modules_real/topics_list.tpl new file mode 100644 index 0000000000..a4447d9421 --- /dev/null +++ b/node_modules_real/topics_list.tpl @@ -0,0 +1,139 @@ +
    + + {{{ each topics }}} +
  • > + + + + + + +
    +
    + + {buildAvatar(./user, "40px", true, "avatar avatar-tooltip")} + + {{{ if showSelect }}} +
    + +
    + {{{ end }}} +
    +
    +

    + {./title} +

    + + + + [[topic:watching]] + + + + [[topic:ignoring]] + + + + [[topic:scheduled]] + + + + {{{ if !./pinExpiry }}}[[topic:pinned]]{{{ else }}}[[topic:pinned-with-expiry, {isoTimeToLocaleString(./pinExpiryISO, config.userLang)}]]{{{ end }}} + + + + [[topic:locked]] + + + + [[topic:moved]] + + {{{each ./icons}}}{@value}{{{end}}} + + {{{ if !template.category }}} + {function.buildCategoryLabel, ./category, "a", "border"} + {{{ end }}} + + + +
    + + + {humanReadableNumber(./postcount, 0)} + + + +
    + + +
    + + +
    + +
    + + {{{ if showSelect }}} +
    + +
    + {{{ end }}} +
    + {{{ if ./thumbs.length }}} + + + +{increment(./thumbs.length, "-1")} + + {{{ end }}} +
    + +
    +
    + {{{ if !reputation:disabled }}} +
    + {humanReadableNumber(./votes, 0)} + [[global:votes]] + +
    + {{{ end }}} +
    + {humanReadableNumber(./postcount, 0)} + [[global:posts]] + +
    +
    + {humanReadableNumber(./viewcount, 0)} + [[global:views]] + +
    +
    +
    +
    + {{{ if ./unreplied }}} +
    + [[category:no-replies]] +
    + {{{ else }}} + {{{ if ./teaser.pid }}} + +
    + + {./teaser.content} +
    + {{{ end }}} + {{{ end }}} +
    +
    +
    +
  • + {{{end}}} +
From d3fb1b07e95bad35e0c9b2ade35f11c8d476066d Mon Sep 17 00:00:00 2001 From: Dachi Date: Wed, 25 Sep 2024 16:07:59 -0700 Subject: [PATCH 013/121] added 'share post to chat' button to every topic listing/post --- node_modules_real/topics_list.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node_modules_real/topics_list.tpl b/node_modules_real/topics_list.tpl index a4447d9421..658e8440e7 100644 --- a/node_modules_real/topics_list.tpl +++ b/node_modules_real/topics_list.tpl @@ -1,5 +1,5 @@