From 0a3ac7170ab4065fb3879c9a7500400475a0a0a2 Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Wed, 29 May 2024 14:19:23 +0000 Subject: [PATCH 1/9] chore: incrementing version number - v3.8.2 --- install/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/package.json b/install/package.json index fcfa3e1668..07d4ad5867 100644 --- a/install/package.json +++ b/install/package.json @@ -2,7 +2,7 @@ "name": "nodebb", "license": "GPL-3.0", "description": "NodeBB Forum", - "version": "3.8.1", + "version": "3.8.2", "homepage": "https://www.nodebb.org", "repository": { "type": "git", From 3854a434272b8e7b6f6b598f167eb88132781f56 Mon Sep 17 00:00:00 2001 From: Misty Release Bot Date: Wed, 29 May 2024 14:19:23 +0000 Subject: [PATCH 2/9] chore: update changelog for v3.8.2 --- CHANGELOG.md | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 30c9a42afd..63f0509b35 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,73 @@ +#### v3.8.2 (2024-05-29) + +##### Chores + +* up composer (83facb7d) +* up harmony (17ea61a0) +* incrementing version number - v3.8.1 (527326f7) +* update changelog for v3.8.1 (5ef3e0f3) +* incrementing version number - v3.8.0 (e228a6eb) +* incrementing version number - v3.7.5 (6882894d) +* incrementing version number - v3.7.4 (6678744c) +* incrementing version number - v3.7.3 (2d62b6f6) +* incrementing version number - v3.7.2 (cc257e7e) +* incrementing version number - v3.7.1 (712365a5) +* incrementing version number - v3.7.0 (9a6153d7) +* incrementing version number - v3.6.7 (86a17e38) +* incrementing version number - v3.6.6 (6604bf37) +* incrementing version number - v3.6.5 (6c653625) +* incrementing version number - v3.6.4 (83d131b4) +* incrementing version number - v3.6.3 (fc7d2bfd) +* incrementing version number - v3.6.2 (0f577a57) +* incrementing version number - v3.6.1 (f1a69468) +* incrementing version number - v3.6.0 (4cdf85f8) +* incrementing version number - v3.5.3 (ed0e8783) +* incrementing version number - v3.5.2 (52fbb2da) +* incrementing version number - v3.5.1 (4c543488) +* incrementing version number - v3.5.0 (d06fb4f0) +* incrementing version number - v3.4.3 (5c984250) +* incrementing version number - v3.4.2 (3f0dac38) +* incrementing version number - v3.4.1 (01e69574) +* incrementing version number - v3.4.0 (fd9247c5) +* incrementing version number - v3.3.9 (5805e770) +* incrementing version number - v3.3.8 (a5603565) +* incrementing version number - v3.3.7 (b26f1744) +* incrementing version number - v3.3.6 (7fb38792) +* incrementing version number - v3.3.4 (a67f84ea) +* incrementing version number - v3.3.3 (f94d239b) +* incrementing version number - v3.3.2 (ec9dac97) +* incrementing version number - v3.3.1 (151cc68f) +* incrementing version number - v3.3.0 (fc1ad70f) +* incrementing version number - v3.2.3 (b06d3e63) +* incrementing version number - v3.2.2 (758ecfcd) +* incrementing version number - v3.2.1 (20145074) +* incrementing version number - v3.2.0 (9ecac38e) +* incrementing version number - v3.1.7 (0b4e81ab) +* incrementing version number - v3.1.6 (b3a3b130) +* incrementing version number - v3.1.5 (ec19343a) +* incrementing version number - v3.1.4 (2452783c) +* incrementing version number - v3.1.3 (3b4e9d3f) +* incrementing version number - v3.1.2 (40fa3489) +* incrementing version number - v3.1.1 (40250733) +* incrementing version number - v3.1.0 (0cb386bd) +* incrementing version number - v3.0.1 (26f6ea49) +* incrementing version number - v3.0.0 (224e08cd) + +##### New Features + +* show ignored/watched topics in topic list, closes #10974 (29dbe92d) +* convert "All Votes Are Public" toggle to vote visibility (e0515080) + +##### Bug Fixes + +* wrong var for ignored (7969e62d) +* reduce docker image size again and speed up build (56ef2bdd) +* update thumb count when removing thumbs (6214336c) + +##### Refactors + +* render (2c0f8c91) + #### v3.8.1 (2024-05-15) ##### Chores From 1aaa6cbbc53fb8a08557e7d7679445d8f2f8c9f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 31 May 2024 11:45:41 -0400 Subject: [PATCH 3/9] feat: add voters/upvoters v3 routes closes #12423 --- public/openapi/write.yaml | 4 + public/openapi/write/posts/pid/upvoters.yaml | 33 ++++++ public/openapi/write/posts/pid/voters.yaml | 37 +++++++ public/src/client/topic/votes.js | 8 +- src/api/posts.js | 90 +++++++++++++++++ src/controllers/write/posts.js | 10 ++ src/routes/write/posts.js | 2 + src/socket.io/posts/votes.js | 101 ++----------------- 8 files changed, 186 insertions(+), 99 deletions(-) create mode 100644 public/openapi/write/posts/pid/upvoters.yaml create mode 100644 public/openapi/write/posts/pid/voters.yaml diff --git a/public/openapi/write.yaml b/public/openapi/write.yaml index 79657b519e..c59b9bce29 100644 --- a/public/openapi/write.yaml +++ b/public/openapi/write.yaml @@ -180,6 +180,10 @@ paths: $ref: 'write/posts/pid/move.yaml' /posts/{pid}/vote: $ref: 'write/posts/pid/vote.yaml' + /posts/{pid}/voters: + $ref: 'write/posts/pid/voters.yaml' + /posts/{pid}/upvoters: + $ref: 'write/posts/pid/upvoters.yaml' /posts/{pid}/bookmark: $ref: 'write/posts/pid/bookmark.yaml' /posts/{pid}/diffs: diff --git a/public/openapi/write/posts/pid/upvoters.yaml b/public/openapi/write/posts/pid/upvoters.yaml new file mode 100644 index 0000000000..d005e33529 --- /dev/null +++ b/public/openapi/write/posts/pid/upvoters.yaml @@ -0,0 +1,33 @@ +get: + tags: + - posts + summary: get upvoter usernames of a post + description: This is used for getting a list of upvoter usernames for the vote tooltip + parameters: + - in: path + name: pid + schema: + type: string + required: true + description: a valid post id + example: 2 + responses: + '200': + description: Usernames of upvoters of post + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + otherCount: + type: number + usernames: + type: array + cutoff: + type: number + diff --git a/public/openapi/write/posts/pid/voters.yaml b/public/openapi/write/posts/pid/voters.yaml new file mode 100644 index 0000000000..868b587c36 --- /dev/null +++ b/public/openapi/write/posts/pid/voters.yaml @@ -0,0 +1,37 @@ +get: + tags: + - posts + summary: get voters of a post + description: This returns the upvoters and downvoters of a post if the user has permission to view them + parameters: + - in: path + name: pid + schema: + type: string + required: true + description: a valid post id + example: 2 + responses: + '200': + description: Data about upvoters and downvoters of the post + content: + application/json: + schema: + type: object + properties: + status: + $ref: ../../../components/schemas/Status.yaml#/Status + response: + type: object + properties: + upvoteCount: + type: number + downvoteCount: + type: number + showDownvotes: + type: boolean + upvoters: + type: array + downvoters: + type: array + diff --git a/public/src/client/topic/votes.js b/public/src/client/topic/votes.js index b4365697ed..29876ac148 100644 --- a/public/src/client/topic/votes.js +++ b/public/src/client/topic/votes.js @@ -35,15 +35,15 @@ define('forum/topic/votes', [ $this.attr('title', ''); } - socket.emit('posts.getUpvoters', [pid], function (err, data) { + api.get(`/posts/${pid}/upvoters`, {}, function (err, data) { if (err) { if (err.message === '[[error:no-privileges]]') { return; } return alerts.error(err); } - if (_showTooltip[pid] && data.length) { - createTooltip($this, data[0]); + if (_showTooltip[pid] && data) { + createTooltip($this, data); } }); } @@ -101,7 +101,7 @@ define('forum/topic/votes', [ }; Votes.showVotes = function (pid) { - socket.emit('posts.getVoters', { pid: pid }, function (err, data) { + api.get(`/posts/${pid}/voters`, {}, function (err, data) { if (err) { if (err.message === '[[error:no-privileges]]') { return; diff --git a/src/api/posts.js b/src/api/posts.js index 603e3bf2aa..791fcdb598 100644 --- a/src/api/posts.js +++ b/src/api/posts.js @@ -3,6 +3,7 @@ const validator = require('validator'); const _ = require('lodash'); +const db = require('../database'); const utils = require('../utils'); const user = require('../user'); const posts = require('../posts'); @@ -306,6 +307,95 @@ postsAPI.unvote = async function (caller, data) { return await apiHelpers.postCommand(caller, 'unvote', 'voted', '', data); }; +postsAPI.getVoters = async function (caller, data) { + if (!data || !data.pid) { + throw new Error('[[error:invalid-data]]'); + } + const { pid } = data; + const cid = await posts.getCidByPid(pid); + if (!await canSeeVotes(caller.uid, cid)) { + throw new Error('[[error:no-privileges]]'); + } + const showDownvotes = !meta.config['downvote:disabled']; + const [upvoteUids, downvoteUids] = await Promise.all([ + db.getSetMembers(`pid:${data.pid}:upvote`), + showDownvotes ? db.getSetMembers(`pid:${data.pid}:downvote`) : [], + ]); + + const [upvoters, downvoters] = await Promise.all([ + user.getUsersFields(upvoteUids, ['username', 'userslug', 'picture']), + user.getUsersFields(downvoteUids, ['username', 'userslug', 'picture']), + ]); + + return { + upvoteCount: upvoters.length, + downvoteCount: downvoters.length, + showDownvotes: showDownvotes, + upvoters: upvoters, + downvoters: downvoters, + }; +}; + +postsAPI.getUpvoters = async function (caller, data) { + if (!data.pid) { + throw new Error('[[error:invalid-data]]'); + } + const { pid } = data; + const cid = await posts.getCidByPid(pid); + if (!await canSeeVotes(caller.uid, cid)) { + throw new Error('[[error:no-privileges]]'); + } + + let upvotedUids = (await posts.getUpvotedUidsByPids([pid]))[0]; + const cutoff = 6; + if (!upvotedUids.length) { + return { + otherCount: 0, + usernames: [], + cutoff, + }; + } + let otherCount = 0; + if (upvotedUids.length > cutoff) { + otherCount = upvotedUids.length - (cutoff - 1); + upvotedUids = upvotedUids.slice(0, cutoff - 1); + } + + const usernames = await user.getUsernamesByUids(upvotedUids); + return { + otherCount, + usernames, + cutoff, + }; +}; + +async function canSeeVotes(uid, cids) { + const isArray = Array.isArray(cids); + if (!isArray) { + cids = [cids]; + } + const uniqCids = _.uniq(cids); + const [canRead, isAdmin, isMod] = await Promise.all([ + privileges.categories.isUserAllowedTo( + 'topics:read', uniqCids, uid + ), + privileges.users.isAdministrator(uid), + privileges.users.isModerator(uid, cids), + ]); + const cidToAllowed = _.zipObject(uniqCids, canRead); + const checks = cids.map( + (cid, index) => isAdmin || isMod[index] || + ( + cidToAllowed[cid] && + ( + meta.config.voteVisibility === 'all' || + (meta.config.voteVisibility === 'loggedin' && parseInt(uid, 10) > 0) + ) + ) + ); + return isArray ? checks : checks[0]; +} + postsAPI.bookmark = async function (caller, data) { return await apiHelpers.postCommand(caller, 'bookmark', 'bookmarked', '', data); }; diff --git a/src/controllers/write/posts.js b/src/controllers/write/posts.js index 529eabfe44..1dc8cf6800 100644 --- a/src/controllers/write/posts.js +++ b/src/controllers/write/posts.js @@ -131,6 +131,16 @@ Posts.unvote = async (req, res) => { helpers.formatApiResponse(200, res); }; +Posts.getVoters = async (req, res) => { + const data = await api.posts.getVoters(req, { pid: req.params.pid }); + helpers.formatApiResponse(200, res, data); +}; + +Posts.getUpvoters = async (req, res) => { + const data = await api.posts.getUpvoters(req, { pid: req.params.pid }); + helpers.formatApiResponse(200, res, data); +}; + Posts.bookmark = async (req, res) => { const data = await mock(req); await api.posts.bookmark(req, data); diff --git a/src/routes/write/posts.js b/src/routes/write/posts.js index a834d26088..e573bbb9b0 100644 --- a/src/routes/write/posts.js +++ b/src/routes/write/posts.js @@ -26,6 +26,8 @@ module.exports = function () { setupApiRoute(router, 'put', '/:pid/vote', [...middlewares, middleware.checkRequired.bind(null, ['delta'])], controllers.write.posts.vote); setupApiRoute(router, 'delete', '/:pid/vote', middlewares, controllers.write.posts.unvote); + setupApiRoute(router, 'get', '/:pid/voters', [middleware.assert.post], controllers.write.posts.getVoters); + setupApiRoute(router, 'get', '/:pid/upvoters', [middleware.assert.post], controllers.write.posts.getUpvoters); setupApiRoute(router, 'put', '/:pid/bookmark', middlewares, controllers.write.posts.bookmark); setupApiRoute(router, 'delete', '/:pid/bookmark', middlewares, controllers.write.posts.unbookmark); diff --git a/src/socket.io/posts/votes.js b/src/socket.io/posts/votes.js index cd0b6f3b9b..a7426e49ba 100644 --- a/src/socket.io/posts/votes.js +++ b/src/socket.io/posts/votes.js @@ -1,105 +1,16 @@ 'use strict'; -const _ = require('lodash'); - -const db = require('../../database'); -const user = require('../../user'); -const posts = require('../../posts'); -const privileges = require('../../privileges'); -const meta = require('../../meta'); +const api = require('../../api'); +const sockets = require('../index'); module.exports = function (SocketPosts) { SocketPosts.getVoters = async function (socket, data) { - if (!data || !data.pid) { - throw new Error('[[error:invalid-data]]'); - } - const cid = await posts.getCidByPid(data.pid); - if (!await canSeeVotes(socket.uid, cid)) { - throw new Error('[[error:no-privileges]]'); - } - const showDownvotes = !meta.config['downvote:disabled']; - const [upvoteUids, downvoteUids] = await Promise.all([ - db.getSetMembers(`pid:${data.pid}:upvote`), - showDownvotes ? db.getSetMembers(`pid:${data.pid}:downvote`) : [], - ]); - - const [upvoters, downvoters] = await Promise.all([ - user.getUsersFields(upvoteUids, ['username', 'userslug', 'picture']), - user.getUsersFields(downvoteUids, ['username', 'userslug', 'picture']), - ]); - - return { - upvoteCount: upvoters.length, - downvoteCount: downvoters.length, - showDownvotes: showDownvotes, - upvoters: upvoters, - downvoters: downvoters, - }; + sockets.warnDeprecated(socket, 'GET /api/v3/posts/:pid/voters'); + return await api.posts.getVoters(socket, { pid: data.pid }); }; SocketPosts.getUpvoters = async function (socket, pids) { - if (!Array.isArray(pids)) { - throw new Error('[[error:invalid-data]]'); - } - - const cids = await posts.getCidsByPids(pids); - if ((await canSeeVotes(socket.uid, cids)).includes(false)) { - throw new Error('[[error:no-privileges]]'); - } - - const data = await posts.getUpvotedUidsByPids(pids); - if (!data.length) { - return []; - } - const cutoff = 6; - const sliced = data.map((uids) => { - let otherCount = 0; - if (uids.length > cutoff) { - otherCount = uids.length - (cutoff - 1); - uids = uids.slice(0, cutoff - 1); - } - return { - otherCount, - uids, - }; - }); - - const uniqUids = _.uniq(_.flatten(sliced.map(d => d.uids))); - const usernameMap = _.zipObject(uniqUids, await user.getUsernamesByUids(uniqUids)); - const result = sliced.map( - data => ({ - otherCount: data.otherCount, - cutoff: cutoff, - usernames: data.uids.map(uid => usernameMap[uid]), - }) - ); - return result; + sockets.warnDeprecated(socket, 'GET /api/v3/posts/:pid/upvoters'); + return await api.posts.getUpvoters(socket, { pid: pids[0] }); }; - - async function canSeeVotes(uid, cids) { - const isArray = Array.isArray(cids); - if (!isArray) { - cids = [cids]; - } - const uniqCids = _.uniq(cids); - const [canRead, isAdmin, isMod] = await Promise.all([ - privileges.categories.isUserAllowedTo( - 'topics:read', uniqCids, uid - ), - privileges.users.isAdministrator(uid), - privileges.users.isModerator(uid, cids), - ]); - const cidToAllowed = _.zipObject(uniqCids, canRead); - const checks = cids.map( - (cid, index) => isAdmin || isMod[index] || - ( - cidToAllowed[cid] && - ( - meta.config.voteVisibility === 'all' || - (meta.config.voteVisibility === 'loggedin' && parseInt(uid, 10) > 0) - ) - ) - ); - return isArray ? checks : checks[0]; - } }; From e98f184868a72d8083dd9bda8105bef44578ce29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 31 May 2024 11:49:34 -0400 Subject: [PATCH 4/9] refactor: add sanity checks to sio --- src/socket.io/posts/votes.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/socket.io/posts/votes.js b/src/socket.io/posts/votes.js index a7426e49ba..3a92360535 100644 --- a/src/socket.io/posts/votes.js +++ b/src/socket.io/posts/votes.js @@ -5,11 +5,17 @@ const sockets = require('../index'); module.exports = function (SocketPosts) { SocketPosts.getVoters = async function (socket, data) { + if (!data || !data.pid) { + throw new Error('[[error:invalid-data]]'); + } sockets.warnDeprecated(socket, 'GET /api/v3/posts/:pid/voters'); return await api.posts.getVoters(socket, { pid: data.pid }); }; SocketPosts.getUpvoters = async function (socket, pids) { + if (!Array.isArray(pids)) { + throw new Error('[[error:invalid-data]]'); + } sockets.warnDeprecated(socket, 'GET /api/v3/posts/:pid/upvoters'); return await api.posts.getUpvoters(socket, { pid: pids[0] }); }; From 42230300a0b7d5959f1fca5d236c3dbc7b115ef0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 31 May 2024 11:59:46 -0400 Subject: [PATCH 5/9] test: fix post test --- test/posts.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/posts.js b/test/posts.js index e52b5cdf23..20403e24cf 100644 --- a/test/posts.js +++ b/test/posts.js @@ -184,8 +184,8 @@ describe('Post\'s', () => { it('should get upvoters', (done) => { socketPosts.getUpvoters({ uid: globalModUid }, [postData.pid], (err, data) => { assert.ifError(err); - assert.equal(data[0].otherCount, 0); - assert.equal(data[0].usernames, 'upvoter'); + assert.equal(data.otherCount, 0); + assert.equal(data.usernames, 'upvoter'); done(); }); }); From 56b5850a07bc254f60d4d00cc3ed31bcdff7deab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 4 Jun 2024 12:22:48 -0400 Subject: [PATCH 6/9] fix: #12614 fix html markup for widget containers --- src/views/admin/extend/widgets.tpl | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/views/admin/extend/widgets.tpl b/src/views/admin/extend/widgets.tpl index ae1effdc37..5a7f86d86d 100644 --- a/src/views/admin/extend/widgets.tpl +++ b/src/views/admin/extend/widgets.tpl @@ -121,15 +121,15 @@
-
+
[[admin/extend/widgets:container.card-header]] -
- + + + + +
@@ -138,9 +138,9 @@
-
+
[[admin/extend/widgets:container.alert]] -
+
From b6671d1672f89402a3654c0e991fca9940239069 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 6 Jun 2024 10:39:31 -0400 Subject: [PATCH 7/9] fix: dont autoconnect for spiders, closes #12620 --- public/src/sockets.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/src/sockets.js b/public/src/sockets.js index e4ef8273e1..2302eafe47 100644 --- a/public/src/sockets.js +++ b/public/src/sockets.js @@ -16,6 +16,7 @@ app = window.app || {}; reconnectionAttempts: config.maxReconnectionAttempts, reconnectionDelay: config.reconnectionDelay, transports: config.socketioTransports, + autoConnect: false, path: config.relative_path + '/socket.io', query: { _csrf: config.csrf_token, @@ -48,6 +49,7 @@ app = window.app || {}; hooks = _hooks; if (parseInt(app.user.uid, 10) >= 0) { addHandlers(); + socket.connect(); } }); From ef19eb156a48777acbdc760c10c45297e1884e86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 6 Jun 2024 10:52:14 -0400 Subject: [PATCH 8/9] #12620 --- public/src/ajaxify.js | 2 +- public/src/sockets.js | 2 +- src/socket.io/index.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/src/ajaxify.js b/public/src/ajaxify.js index d6748dca1b..e6c4648dad 100644 --- a/public/src/ajaxify.js +++ b/public/src/ajaxify.js @@ -25,7 +25,7 @@ ajaxify.widgets = { render: render }; } ajaxify.go = function (url, callback, quiet) { // Automatically reconnect to socket and re-ajaxify on success - if (!socket.connected) { + if (!socket.connected && parseInt(app.user.uid, 10) >= 0) { app.reconnect(); if (ajaxify.reconnectAction) { diff --git a/public/src/sockets.js b/public/src/sockets.js index 2302eafe47..799dc038cd 100644 --- a/public/src/sockets.js +++ b/public/src/sockets.js @@ -54,7 +54,7 @@ app = window.app || {}; }); window.app.reconnect = () => { - if (socket.connected) { + if (socket.connected || parseInt(app.user.uid, 10) < 0) { return; } diff --git a/src/socket.io/index.js b/src/socket.io/index.js index d0ba0b4b19..58b5c0f1a7 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -131,7 +131,7 @@ async function onConnect(socket) { return; } - if (socket.uid) { + if (socket.uid > 0) { socket.join(`uid_${socket.uid}`); socket.join('online_users'); } else { From bcd4997d69114d07505da4bd5cc98d564c71f0ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 6 Jun 2024 10:54:22 -0400 Subject: [PATCH 9/9] fix: dont add spiders to online_guests room --- src/socket.io/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/socket.io/index.js b/src/socket.io/index.js index 58b5c0f1a7..bef29f7e66 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -134,7 +134,7 @@ async function onConnect(socket) { if (socket.uid > 0) { socket.join(`uid_${socket.uid}`); socket.join('online_users'); - } else { + } else if (socket.uid === 0) { socket.join('online_guests'); }