fix: #11981, post immediately when canceling scheduling

isekai-main
Barış Soner Uşaklı 1 year ago
parent 5c023025b4
commit 19b7cdb245

@ -186,7 +186,7 @@ module.exports = function (Posts) {
throw new Error('[[error:no-privileges]]'); throw new Error('[[error:no-privileges]]');
} }
const isMain = parseInt(data.pid, 10) === parseInt(topicData.mainPid, 10); const isMain = parseInt(data.pid, 10) === parseInt(topicData.mainPid, 10);
if (isMain && (isNaN(data.timestamp) || data.timestamp < Date.now())) { if (isMain && isNaN(data.timestamp)) {
throw new Error('[[error:invalid-data]]'); throw new Error('[[error:invalid-data]]');
} }
} }

@ -26,6 +26,11 @@ Scheduled.handleExpired = async function () {
return; return;
} }
await postTids(tids);
await db.sortedSetsRemoveRangeByScore([`topics:scheduled`], '-inf', now);
};
async function postTids(tids) {
let topicsData = await topics.getTopicsData(tids); let topicsData = await topics.getTopicsData(tids);
// Filter deleted // Filter deleted
topicsData = topicsData.filter(topicData => Boolean(topicData)); topicsData = topicsData.filter(topicData => Boolean(topicData));
@ -43,9 +48,8 @@ Scheduled.handleExpired = async function () {
updateUserLastposttimes(uids, topicsData), updateUserLastposttimes(uids, topicsData),
updateGroupPosts(uids, topicsData), updateGroupPosts(uids, topicsData),
...topicsData.map(topicData => unpin(topicData.tid, topicData)), ...topicsData.map(topicData => unpin(topicData.tid, topicData)),
db.sortedSetsRemoveRangeByScore([`topics:scheduled`], '-inf', now)
)); ));
}; }
// topics/tools.js#pin/unpin would block non-admins/mods, thus the local versions // topics/tools.js#pin/unpin would block non-admins/mods, thus the local versions
Scheduled.pin = async function (tid, topicData) { Scheduled.pin = async function (tid, topicData) {
@ -62,6 +66,9 @@ Scheduled.pin = async function (tid, topicData) {
}; };
Scheduled.reschedule = async function ({ cid, tid, timestamp, uid }) { Scheduled.reschedule = async function ({ cid, tid, timestamp, uid }) {
if (timestamp < Date.now()) {
await postTids([tid]);
} else {
const mainPid = await topics.getTopicField(tid, 'mainPid'); const mainPid = await topics.getTopicField(tid, 'mainPid');
await Promise.all([ await Promise.all([
db.sortedSetsAdd([ db.sortedSetsAdd([
@ -78,7 +85,8 @@ Scheduled.reschedule = async function ({ cid, tid, timestamp, uid }) {
], timestamp, mainPid), ], timestamp, mainPid),
shiftPostTimes(tid, timestamp), shiftPostTimes(tid, timestamp),
]); ]);
return topics.updateLastPostTimeFromLastPid(tid); await topics.updateLastPostTimeFromLastPid(tid);
}
}; };
function unpin(tid, topicData) { function unpin(tid, topicData) {

Loading…
Cancel
Save