diff --git a/package.json b/package.json index 995721d9..120596a0 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "author": "Calvin Montgomery", "name": "CyTube", "description": "Online media synchronizer and chat", - "version": "3.82.9", + "version": "3.82.10", "repository": { "url": "http://github.com/calzoneman/sync" }, diff --git a/src/channel/voteskip.js b/src/channel/voteskip.js index 67171264..87f3a046 100644 --- a/src/channel/voteskip.js +++ b/src/channel/voteskip.js @@ -80,7 +80,10 @@ VoteskipModule.prototype.update = function () { const { counts } = this.poll.toUpdateFrame(false); const { total, eligible, noPermission, afk } = this.calcUsercounts(); - const need = Math.ceil(eligible * this.channel.modules.options.get("voteskip_ratio")); + const need = Math.max( + 1, // Require at least one vote, see #944 + Math.ceil(eligible * this.channel.modules.options.get("voteskip_ratio")) + ); if (counts[0] >= need) { const info = `${counts[0]}/${eligible} skipped; ` + `eligible voters: ${eligible} = total (${total}) - AFK (${afk}) ` + diff --git a/test/channel/voteskip.js b/test/channel/voteskip.js index 4dca2813..cc49b702 100644 --- a/test/channel/voteskip.js +++ b/test/channel/voteskip.js @@ -102,6 +102,23 @@ describe('VoteskipModule', () => { voteskipModule.update(); assert(sentMessage, 'Expected voteskip passed message'); }); + + it('requires at least one vote to pass', () => { + let sentMessage = false; + fakeChannel.broadcastAll = (frame, data) => { + assert.strictEqual(frame, 'chatMsg'); + assert(/voteskip passed/i.test(data.msg), 'Expected voteskip passed message') + sentMessage = true; + }; + fakeUser.is = flag => (flag == Flags.U_AFK); + voteskipModule.poll = { + toUpdateFrame() { + return { counts: [0] }; + } + }; + voteskipModule.update(); + assert(!sentMessage, 'Expected voteskip not to pass'); + }); }); describe('#calcUsercounts', () => {