function Chat() {
const onlineStatus = new Map();
const loginCounts = new Map();
let onlineCount = 0;
function login(id) {
if (!onlineStatus.has(id) || !onlineStatus.get(id)) {
onlineStatus.set(id, true);
onlineCount++;
if (!loginCounts.has(id)) {
loginCounts.set(id, 1);
} else {
loginCounts.set(id, loginCounts.get(id) + 1);
}
}
}
function logout(id) {
if (onlineStatus.has(id) && onlineStatus.get(id)) {
onlineStatus.set(id, false);
onlineCount--;
}
}
function isOnline(id) {
return onlineStatus.has(id) && onlineStatus.get(id);
}
function countOnline() {
return onlineCount;
}
function countLogins(id) {
return loginCounts.has(id) ? loginCounts.get(id) : 0;
}
return {
login,
logout,
isOnline,
countOnline,
countLogins
}
}
const myChat = Chat();
myChat.login(3);
myChat.login(2);
myChat.logout(3);
console.log(myChat.countOnline()); // 1
console.log(myChat.countLogins(3)); // 1
console.log(myChat.countLogins(2)); // 1
myChat.login(3);
console.log(myChat.countLogins(3)); // 2
ZnVuY3Rpb24gQ2hhdCgpIHsKICBjb25zdCBvbmxpbmVTdGF0dXMgPSBuZXcgTWFwKCk7CiAgY29uc3QgbG9naW5Db3VudHMgPSBuZXcgTWFwKCk7CiAgbGV0IG9ubGluZUNvdW50ID0gMDsKCiAgZnVuY3Rpb24gbG9naW4oaWQpIHsKICAgIGlmICghb25saW5lU3RhdHVzLmhhcyhpZCkgfHwgIW9ubGluZVN0YXR1cy5nZXQoaWQpKSB7CiAgICAgICAgb25saW5lU3RhdHVzLnNldChpZCwgdHJ1ZSk7CiAgICAgICAgb25saW5lQ291bnQrKzsKICAgICAgICBpZiAoIWxvZ2luQ291bnRzLmhhcyhpZCkpIHsKICAgICAgICAgICAgbG9naW5Db3VudHMuc2V0KGlkLCAxKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsb2dpbkNvdW50cy5zZXQoaWQsIGxvZ2luQ291bnRzLmdldChpZCkgKyAxKTsKICAgICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBsb2dvdXQoaWQpIHsKICAgIGlmIChvbmxpbmVTdGF0dXMuaGFzKGlkKSAmJiBvbmxpbmVTdGF0dXMuZ2V0KGlkKSkgewogICAgICAgIG9ubGluZVN0YXR1cy5zZXQoaWQsIGZhbHNlKTsKICAgICAgICBvbmxpbmVDb3VudC0tOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaXNPbmxpbmUoaWQpIHsKICAgIHJldHVybiBvbmxpbmVTdGF0dXMuaGFzKGlkKSAmJiBvbmxpbmVTdGF0dXMuZ2V0KGlkKTsKICB9CgogIGZ1bmN0aW9uIGNvdW50T25saW5lKCkgewogICAgcmV0dXJuIG9ubGluZUNvdW50OwogIH0KCiAgZnVuY3Rpb24gY291bnRMb2dpbnMoaWQpIHsKICAgIHJldHVybiBsb2dpbkNvdW50cy5oYXMoaWQpID8gbG9naW5Db3VudHMuZ2V0KGlkKSA6IDA7CiAgfQoKICByZXR1cm4gewogICAgbG9naW4sCiAgICBsb2dvdXQsCiAgICBpc09ubGluZSwKICAgIGNvdW50T25saW5lLAogICAgY291bnRMb2dpbnMKICB9Cn0KCmNvbnN0IG15Q2hhdCA9IENoYXQoKTsKbXlDaGF0LmxvZ2luKDMpOwpteUNoYXQubG9naW4oMik7Cm15Q2hhdC5sb2dvdXQoMyk7CmNvbnNvbGUubG9nKG15Q2hhdC5jb3VudE9ubGluZSgpKTsgLy8gMQpjb25zb2xlLmxvZyhteUNoYXQuY291bnRMb2dpbnMoMykpOyAvLyAxCmNvbnNvbGUubG9nKG15Q2hhdC5jb3VudExvZ2lucygyKSk7IC8vIDEKbXlDaGF0LmxvZ2luKDMpOwpjb25zb2xlLmxvZyhteUNoYXQuY291bnRMb2dpbnMoMykpOyAvLyAy