From 8972130252df76a7ed677a6bb0dc63a9877aa482 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Thu, 10 Jun 2021 18:11:11 +0200 Subject: [PATCH] s/var/let/ --- commands.js | 80 +++++----- components/app.js | 292 +++++++++++++++++------------------ components/buffer-header.js | 16 +- components/buffer-list.js | 12 +- components/buffer.js | 102 ++++++------ components/composer.js | 8 +- components/connect-form.js | 14 +- components/dialog.js | 2 +- components/help.js | 10 +- components/join-form.js | 6 +- components/member-list.js | 4 +- components/network-form.js | 8 +- components/scroll-manager.js | 20 +-- keybindings.js | 22 +-- lib/ansi.js | 6 +- lib/client.js | 107 ++++++------- lib/irc.js | 116 +++++++------- lib/linkify.js | 20 +-- state.js | 111 ++++++------- store.js | 4 +- 20 files changed, 481 insertions(+), 479 deletions(-) diff --git a/commands.js b/commands.js index a17989c..8a3b84f 100644 --- a/commands.js +++ b/commands.js @@ -2,7 +2,7 @@ import * as irc from "./lib/irc.js"; import { SERVER_BUFFER, BufferType } from "./state.js"; function getActiveClient(app) { - var buf = app.state.buffers.get(app.state.activeBuffer); + let buf = app.state.buffers.get(app.state.activeBuffer); if (!buf) { throw new Error("Not connected to server"); } @@ -10,7 +10,7 @@ function getActiveClient(app) { } function getActiveTarget(app) { - var activeBuffer = app.state.buffers.get(app.state.activeBuffer); + let activeBuffer = app.state.buffers.get(app.state.activeBuffer); if (!activeBuffer) { throw new Error("Not in a buffer"); } @@ -18,7 +18,7 @@ function getActiveTarget(app) { } function getActiveChannel(app) { - var activeBuffer = app.state.buffers.get(app.state.activeBuffer); + let activeBuffer = app.state.buffers.get(app.state.activeBuffer); if (!activeBuffer || activeBuffer.type !== BufferType.CHANNEL) { throw new Error("Not in a channel"); } @@ -26,12 +26,12 @@ function getActiveChannel(app) { } function setUserHostMode(app, args, mode) { - var nick = args[0]; + let nick = args[0]; if (!nick) { throw new Error("Missing nick"); } - var activeChannel = getActiveChannel(app); - var client = getActiveClient(app); + let activeChannel = getActiveChannel(app); + let client = getActiveClient(app); client.whois(nick).then((whois) => { const info = whois[irc.RPL_WHOISUSER].params; const user = info[2]; @@ -47,7 +47,7 @@ const join = { usage: "", description: "Join a channel", execute: (app, args) => { - var channel = args[0]; + let channel = args[0]; if (!channel) { throw new Error("Missing channel name"); } @@ -59,9 +59,9 @@ const kick = { usage: "", description: "Remove a user from the channel", execute: (app, args) => { - var nick = args[0]; - var activeChannel = getActiveChannel(app); - var params = [activeChannel, nick]; + let nick = args[0]; + let activeChannel = getActiveChannel(app); + let params = [activeChannel, nick]; if (args.length > 1) { params.push(args.slice(1).join(" ")); } @@ -71,11 +71,11 @@ const kick = { function givemode(app, args, mode) { // TODO: Handle several users at once - var nick = args[0]; + let nick = args[0]; if (!nick) { throw new Error("Missing nick"); } - var activeChannel = getActiveChannel(app); + let activeChannel = getActiveChannel(app); getActiveClient(app).send({ command: "MODE", params: [activeChannel, mode, nick], @@ -88,7 +88,7 @@ export default { description: "Ban a user from the channel, or display the current ban list", execute: (app, args) => { if (args.length == 0) { - var activeChannel = getActiveChannel(app); + let activeChannel = getActiveChannel(app); getActiveClient(app).send({ command: "MODE", params: [activeChannel, "+b"], @@ -102,8 +102,8 @@ export default { usage: "", description: "Switch to a buffer", execute: (app, args) => { - var name = args[0]; - for (var buf of app.state.buffers.values()) { + let name = args[0]; + for (let buf of app.state.buffers.values()) { if (buf.name === name) { app.switchBuffer(buf); return; @@ -115,7 +115,7 @@ export default { "close": { description: "Close the current buffer", execute: (app, args) => { - var activeBuffer = app.state.buffers.get(app.state.activeBuffer); + let activeBuffer = app.state.buffers.get(app.state.activeBuffer); if (!activeBuffer || activeBuffer.type == BufferType.SERVER) { throw new Error("Not in a user or channel buffer"); } @@ -148,11 +148,11 @@ export default { usage: "", description: "Invite a user to the channel", execute: (app, args) => { - var nick = args[0]; + let nick = args[0]; if (!nick) { throw new Error("Missing nick"); } - var activeChannel = getActiveChannel(app); + let activeChannel = getActiveChannel(app); getActiveClient(app).send({ command: "INVITE", params: [ nick, activeChannel, ]}); @@ -180,9 +180,9 @@ export default { usage: "", description: "Send an action message to the current buffer", execute: (app, args) => { - var action = args.join(" "); - var target = getActiveTarget(app); - var text = `\x01ACTION ${action}\x01`; + let action = args.join(" "); + let target = getActiveTarget(app); + let text = `\x01ACTION ${action}\x01`; app.privmsg(target, text); }, }, @@ -190,9 +190,9 @@ export default { usage: "[target] [modes] [mode args...]", description: "Query or change a channel or user mode", execute: (app, args) => { - var target = args[0]; + let target = args[0]; if (!target || target.startsWith("+") || target.startsWith("-")) { - var activeChannel = getActiveChannel(app); + let activeChannel = getActiveChannel(app); args = [activeChannel, ...args]; } getActiveClient(app).send({ command: "MODE", params: args }); @@ -209,8 +209,8 @@ export default { usage: " ", description: "Send a message to a nickname or a channel", execute: (app, args) => { - var target = args[0]; - var text = args.slice(1).join(" "); + let target = args[0]; + let text = args.slice(1).join(" "); getActiveClient(app).send({ command: "PRIVMSG", params: [target, text] }); }, }, @@ -218,7 +218,7 @@ export default { usage: "", description: "Change current nickname", execute: (app, args) => { - var newNick = args[0]; + let newNick = args[0]; getActiveClient(app).send({ command: "NICK", params: [newNick] }); }, }, @@ -226,8 +226,8 @@ export default { usage: " ", description: "Send a notice to a nickname or a channel", execute: (app, args) => { - var target = args[0]; - var text = args.slice(1).join(" "); + let target = args[0]; + let text = args.slice(1).join(" "); getActiveClient(app).send({ command: "NOTICE", params: [target, text] }); }, }, @@ -240,9 +240,9 @@ export default { usage: "[reason]", description: "Leave a channel", execute: (app, args) => { - var reason = args.join(" "); - var activeChannel = getActiveChannel(app); - var params = [activeChannel]; + let reason = args.join(" "); + let activeChannel = getActiveChannel(app); + let params = [activeChannel]; if (reason) { params.push(reason); } @@ -253,7 +253,7 @@ export default { usage: "", description: "Open a buffer to send messages to a nickname", execute: (app, args) => { - var nick = args[0]; + let nick = args[0]; if (!nick) { throw new Error("Missing nickname"); } @@ -270,7 +270,7 @@ export default { usage: "", description: "Send a raw IRC command to the server", execute: (app, args) => { - var msg; + let msg; try { msg = irc.parseMessage(args.join(" ")); } catch (err) { @@ -289,8 +289,8 @@ export default { usage: "", description: "Change current realname", execute: (app, args) => { - var newRealname = args.join(" "); - var client = getActiveClient(app); + let newRealname = args.join(" "); + let client = getActiveClient(app); if (!client.enabledCaps["setname"]) { throw new Error("Server doesn't support changing the realname"); } @@ -301,11 +301,11 @@ export default { usage: " [server]", description: "Request server statistics", execute: (app, args) => { - var query = args[0]; + let query = args[0]; if (!query) { throw new Error("Missing query"); } - var params = [query]; + let params = [query]; if (args.length > 1) { params.push(args.slice(1).join(" ")); } @@ -316,8 +316,8 @@ export default { usage: "", description: "Change the topic of the current channel", execute: (app, args) => { - var activeChannel = getActiveChannel(app); - var params = [activeChannel]; + let activeChannel = getActiveChannel(app); + let params = [activeChannel]; if (args.length > 0) { params.push(args.join(" ")); } @@ -347,7 +347,7 @@ export default { usage: "", description: "Retrieve information about a user", execute: (app, args) => { - var nick = args[0]; + let nick = args[0]; if (!nick) { throw new Error("Missing nick"); } diff --git a/components/app.js b/components/app.js index a1218f4..65b8fc8 100644 --- a/components/app.js +++ b/components/app.js @@ -35,28 +35,28 @@ const configPromise = fetch("./config.json") const CHATHISTORY_MAX_SIZE = 4000; -var messagesCount = 0; +let messagesCount = 0; function parseQueryString() { - var query = window.location.search.substring(1); - var params = {}; + let query = window.location.search.substring(1); + let params = {}; query.split('&').forEach((s) => { if (!s) { return; } - var pair = s.split('='); + let pair = s.split('='); params[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || ""); }); return params; } function fillConnectParams(params) { - var host = window.location.host || "localhost:8080"; - var proto = "wss:"; + let host = window.location.host || "localhost:8080"; + let proto = "wss:"; if (window.location.protocol != "https:") { proto = "ws:"; } - var path = window.location.pathname || "/"; + let path = window.location.pathname || "/"; if (!window.location.host) { path = "/"; } @@ -78,7 +78,7 @@ function fillConnectParams(params) { } function debounce(f, delay) { - var timeout = null; + let timeout = null; return (...args) => { clearTimeout(timeout); timeout = setTimeout(() => { @@ -177,7 +177,7 @@ export default class App extends Component { handleConfig(config) { this.config = config; - var connectParams = {}; + let connectParams = {}; if (config.server) { connectParams.url = config.server.url; @@ -188,7 +188,7 @@ export default class App extends Component { } } - var autoconnect = store.autoconnect.load(); + let autoconnect = store.autoconnect.load(); if (autoconnect) { connectParams = { ...connectParams, @@ -197,7 +197,7 @@ export default class App extends Component { }; } - var queryParams = parseQueryString(); + let queryParams = parseQueryString(); if (queryParams.server) { connectParams.url = queryParams.server; } @@ -245,10 +245,10 @@ export default class App extends Component { } createBuffer(serverID, name) { - var id = null; + let id = null; this.setState((state) => { - var client = this.clients.get(serverID); - var updated; + let client = this.clients.get(serverID); + let updated; [id, updated] = State.createBuffer(state, name, serverID, client); return updated; }); @@ -256,7 +256,7 @@ export default class App extends Component { } switchBuffer(id) { - var buf; + let buf; this.setState((state) => { buf = State.getBuffer(state, id); if (!buf) { @@ -268,7 +268,7 @@ export default class App extends Component { return; } - var lastReadReceipt = this.getReceipt(buf.name, ReceiptType.READ); + let lastReadReceipt = this.getReceipt(buf.name, ReceiptType.READ); // TODO: only mark as read if user scrolled at the bottom this.setBufferState(buf.id, { unread: Unread.NONE, @@ -282,7 +282,7 @@ export default class App extends Component { if (buf.messages.length == 0) { return; } - var lastMsg = buf.messages[buf.messages.length - 1]; + let lastMsg = buf.messages[buf.messages.length - 1]; this.setReceipt(buf.name, ReceiptType.READ, lastMsg); }); } @@ -292,7 +292,7 @@ export default class App extends Component { } getReceipt(target, type) { - var receipts = this.receipts.get(target); + let receipts = this.receipts.get(target); if (!receipts) { return undefined; } @@ -300,12 +300,12 @@ export default class App extends Component { } hasReceipt(target, type, msg) { - var receipt = this.getReceipt(target, type); + let receipt = this.getReceipt(target, type); return receipt && msg.tags.time <= receipt.time; } setReceipt(target, type, msg) { - var receipt = this.getReceipt(target, type); + let receipt = this.getReceipt(target, type); if (this.hasReceipt(target, type, msg)) { return; } @@ -318,9 +318,9 @@ export default class App extends Component { } latestReceipt(type) { - var last = null; + let last = null; this.receipts.forEach((receipts, target) => { - var delivery = receipts[type]; + let delivery = receipts[type]; if (target == "*" || !delivery || !delivery.time) { return; } @@ -332,7 +332,7 @@ export default class App extends Component { } addMessage(serverID, bufName, msg) { - var client = this.clients.get(serverID); + let client = this.clients.get(serverID); msg.key = messagesCount; messagesCount++; @@ -346,15 +346,15 @@ export default class App extends Component { msg.tags.time = irc.formatDate(new Date()); } - var isDelivered = this.hasReceipt(bufName, ReceiptType.DELIVERED, msg); - var isRead = this.hasReceipt(bufName, ReceiptType.READ, msg); + let isDelivered = this.hasReceipt(bufName, ReceiptType.DELIVERED, msg); + let isRead = this.hasReceipt(bufName, ReceiptType.READ, msg); // TODO: messages coming from infinite scroll shouldn't trigger notifications - var msgUnread = Unread.NONE; + let msgUnread = Unread.NONE; if ((msg.command == "PRIVMSG" || msg.command == "NOTICE") && !isRead) { - var text = msg.params[1]; + let text = msg.params[1]; - var kind; + let kind; if (msg.isHighlight) { msgUnread = Unread.HIGHLIGHT; kind = "highlight"; @@ -366,11 +366,11 @@ export default class App extends Component { } if (msgUnread == Unread.HIGHLIGHT && !isDelivered && !irc.parseCTCP(msg)) { - var title = "New " + kind + " from " + msg.prefix.name; + let title = "New " + kind + " from " + msg.prefix.name; if (client.isChannel(bufName)) { title += " in " + bufName; } - var notif = showNotification(title, { + let notif = showNotification(title, { body: stripANSI(text), requireInteraction: true, tag: "msg," + msg.prefix.name + "," + bufName, @@ -384,8 +384,8 @@ export default class App extends Component { if (msg.command === "INVITE" && client.isMyNick(msg.params[0])) { msgUnread = Unread.HIGHLIGHT; - var channel = msg.params[1]; - var notif = new Notification("Invitation to " + channel, { + let channel = msg.params[1]; + let notif = new Notification("Invitation to " + channel, { body: msg.prefix.name + " has invited you to " + channel, requireInteraction: true, tag: "invite," + msg.prefix.name + "," + channel, @@ -411,12 +411,12 @@ export default class App extends Component { this.setReceipt(bufName, ReceiptType.DELIVERED, msg); - var bufID = { server: serverID, name: bufName }; + let bufID = { server: serverID, name: bufName }; this.setState((state) => State.addMessage(state, msg, bufID)); this.setBufferState(bufID, (buf) => { // TODO: set unread if scrolled up - var unread = buf.unread; - var lastReadReceipt = buf.lastReadReceipt; + let unread = buf.unread; + let lastReadReceipt = buf.lastReadReceipt; if (this.state.activeBuffer != buf.id) { unread = Unread.union(unread, msgUnread); } else { @@ -428,15 +428,15 @@ export default class App extends Component { } connect(params) { - var serverID = null; + let serverID = null; this.setState((state) => { - var update; + let update; [serverID, update] = State.createServer(state); return update; }); this.setState({ connectParams: params }); - var client = new Client(fillConnectParams(params)); + let client = new Client(fillConnectParams(params)); this.clients.set(serverID, client); this.setServerState(serverID, { status: client.status }); @@ -474,7 +474,7 @@ export default class App extends Component { serverID = State.getActiveServerID(this.state); } - var client = this.clients.get(serverID); + let client = this.clients.get(serverID); if (client) { this.clients.delete(serverID); client.disconnect(); @@ -486,14 +486,14 @@ export default class App extends Component { serverID = State.getActiveServerID(this.state); } - var client = this.clients.get(serverID); + let client = this.clients.get(serverID); if (client) { client.reconnect(); } } serverFromBouncerNetwork(bouncerNetworkID) { - for (var [id, client] of this.clients) { + for (let [id, client] of this.clients) { if (client.params.bouncerNetwork === bouncerNetworkID) { return id; } @@ -502,11 +502,12 @@ export default class App extends Component { } handleMessage(serverID, msg) { - var client = this.clients.get(serverID); - var chatHistoryBatch = irc.findBatchByType(msg, "chathistory"); + let client = this.clients.get(serverID); + let chatHistoryBatch = irc.findBatchByType(msg, "chathistory"); this.setState((state) => State.handleMessage(state, msg, serverID, client)); + let target, channel, affectedBuffers; switch (msg.command) { case irc.RPL_WELCOME: if (this.state.connectParams.autojoin.length > 0) { @@ -516,23 +517,23 @@ export default class App extends Component { }); } - var lastReceipt = this.latestReceipt(ReceiptType.READ); + let lastReceipt = this.latestReceipt(ReceiptType.READ); if (lastReceipt && lastReceipt.time && client.enabledCaps["draft/chathistory"] && (!client.enabledCaps["soju.im/bouncer-networks"] || client.params.bouncerNetwork)) { - var now = irc.formatDate(new Date()); + let now = irc.formatDate(new Date()); client.fetchHistoryTargets(now, lastReceipt.time).then((targets) => { targets.forEach((target) => { - var from = this.getReceipt(target, ReceiptType.READ); + let from = this.getReceipt(target, ReceiptType.READ); if (!from) { from = lastReceipt; } - var to = { time: msg.tags.time || irc.formatDate(new Date()) }; + let to = { time: msg.tags.time || irc.formatDate(new Date()) }; this.fetchBacklog(client, target.name, from, to); }); }); } break; case "MODE": - var target = msg.params[0]; + target = msg.params[0]; if (client.isChannel(target)) { this.addMessage(serverID, target, msg); } @@ -542,7 +543,7 @@ export default class App extends Component { break; case "NOTICE": case "PRIVMSG": - var target = msg.params[0]; + target = msg.params[0]; if (client.isMyNick(target)) { if (client.cm(msg.prefix.name) === client.cm(client.serverPrefix.name)) { target = SERVER_BUFFER; @@ -555,9 +556,9 @@ export default class App extends Component { target = SERVER_BUFFER; } - var allowedPrefixes = client.isupport.get("STATUSMSG"); + let allowedPrefixes = client.isupport.get("STATUSMSG"); if (allowedPrefixes) { - var parts = irc.parseTargetPrefix(target, allowedPrefixes); + let parts = irc.parseTargetPrefix(target, allowedPrefixes); if (client.isChannel(parts.name)) { target = parts.name; } @@ -566,7 +567,7 @@ export default class App extends Component { this.addMessage(serverID, target, msg); break; case "JOIN": - var channel = msg.params[0]; + channel = msg.params[0]; if (!client.isMyNick(msg.prefix.name)) { this.addMessage(serverID, channel, msg); @@ -577,7 +578,7 @@ export default class App extends Component { } break; case "PART": - var channel = msg.params[0]; + channel = msg.params[0]; this.addMessage(serverID, channel, msg); @@ -587,16 +588,16 @@ export default class App extends Component { } break; case "KICK": - var channel = msg.params[0]; + channel = msg.params[0]; this.addMessage(serverID, channel, msg); break; case "QUIT": - var affectedBuffers = []; + affectedBuffers = []; if (chatHistoryBatch) { affectedBuffers.push(chatHistoryBatch.params[0]); } else { this.setState((state) => { - var buffers = new Map(state.buffers); + let buffers = new Map(state.buffers); state.buffers.forEach((buf) => { if (buf.server != serverID) { return; @@ -604,9 +605,9 @@ export default class App extends Component { if (!buf.members.has(msg.prefix.name) && client.cm(buf.name) !== client.cm(msg.prefix.name)) { return; } - var members = new irc.CaseMapMap(buf.members); + let members = new irc.CaseMapMap(buf.members); members.delete(msg.prefix.name); - var offline = client.cm(buf.name) === client.cm(msg.prefix.name); + let offline = client.cm(buf.name) === client.cm(msg.prefix.name); buffers.set(buf.id, { ...buf, members, offline }); affectedBuffers.push(buf.name); }); @@ -617,14 +618,14 @@ export default class App extends Component { affectedBuffers.forEach((name) => this.addMessage(serverID, name, msg)); break; case "NICK": - var newNick = msg.params[0]; + let newNick = msg.params[0]; - var affectedBuffers = []; + affectedBuffers = []; if (chatHistoryBatch) { affectedBuffers.push(chatHistoryBatch.params[0]); } else { this.setState((state) => { - var buffers = new Map(state.buffers); + let buffers = new Map(state.buffers); state.buffers.forEach((buf) => { if (buf.server != serverID) { return; @@ -632,7 +633,7 @@ export default class App extends Component { if (!buf.members.has(msg.prefix.name)) { return; } - var members = new irc.CaseMapMap(buf.members); + let members = new irc.CaseMapMap(buf.members); members.set(newNick, members.get(msg.prefix.name)); members.delete(msg.prefix.name); buffers.set(buf.id, { ...buf, members }); @@ -645,14 +646,14 @@ export default class App extends Component { affectedBuffers.forEach((name) => this.addMessage(serverID, name, msg)); break; case "TOPIC": - var channel = msg.params[0]; + channel = msg.params[0]; this.addMessage(serverID, channel, msg); break; case "INVITE": - var channel = msg.params[1]; + channel = msg.params[1]; // TODO: find a more reliable way to do this - var bufName = channel; + let bufName = channel; if (!State.getBuffer(this.state, { server: serverID, name: channel })) { bufName = SERVER_BUFFER; } @@ -670,19 +671,19 @@ export default class App extends Component { break; } - var id = msg.params[1]; - var attrs = null; + let id = msg.params[1]; + let attrs = null; if (msg.params[2] !== "*") { attrs = irc.parseTags(msg.params[2]); } - var isNew = false; + let isNew = false; this.setState((state) => { - var bouncerNetworks = new Map(state.bouncerNetworks); + let bouncerNetworks = new Map(state.bouncerNetworks); if (!attrs) { bouncerNetworks.delete(id); } else { - var prev = bouncerNetworks.get(id); + let prev = bouncerNetworks.get(id); isNew = prev === undefined; attrs = { ...prev, ...attrs }; bouncerNetworks.set(id, attrs); @@ -690,7 +691,7 @@ export default class App extends Component { return { bouncerNetworks }; }, () => { if (!attrs) { - var serverID = this.serverFromBouncerNetwork(id); + let serverID = this.serverFromBouncerNetwork(id); if (serverID) { this.close({ server: serverID, name: SERVER_BUFFER }); } @@ -710,7 +711,7 @@ export default class App extends Component { case irc.RPL_ENDOFEXCEPTLIST: case irc.RPL_BANLIST: case irc.RPL_ENDOFBANLIST: - var channel = msg.params[1]; + channel = msg.params[1]; this.addMessage(serverID, channel, msg); break; case irc.RPL_MYINFO: @@ -734,7 +735,7 @@ export default class App extends Component { break; default: if (irc.isError(msg.command) && msg.command != irc.ERR_NOMOTD) { - var description = msg.params[msg.params.length - 1]; + let description = msg.params[msg.params.length - 1]; this.setState({ error: description }); } this.addMessage(serverID, SERVER_BUFFER, msg); @@ -754,8 +755,8 @@ export default class App extends Component { } handleChannelClick(channel) { - var serverID = State.getActiveServerID(this.state); - var buf = State.getBuffer(this.state, { server: serverID, name: channel }); + let serverID = State.getActiveServerID(this.state); + let buf = State.getBuffer(this.state, { server: serverID, name: channel }); if (buf) { this.switchBuffer(buf.id); } else { @@ -780,7 +781,7 @@ export default class App extends Component { serverID = State.getActiveServerID(this.state); } - var client = this.clients.get(serverID); + let client = this.clients.get(serverID); if (client.isServer(target)) { this.switchBuffer({ server: serverID }); } else if (client.isChannel(target)) { @@ -794,22 +795,23 @@ export default class App extends Component { } close(id) { - var buf = State.getBuffer(this.state, id); + let buf = State.getBuffer(this.state, id); if (!buf) { return; } + let client = this.clients.get(buf.server); switch (buf.type) { case BufferType.SERVER: this.setState((state) => { - var buffers = new Map(state.buffers); - for (var [id, b] of state.buffers) { + let buffers = new Map(state.buffers); + for (let [id, b] of state.buffers) { if (b.server === buf.server) { buffers.delete(id); } } - var activeBuffer = state.activeBuffer; + let activeBuffer = state.activeBuffer; if (activeBuffer && state.buffers.get(activeBuffer).server === buf.server) { if (buffers.size > 0) { activeBuffer = buffers.keys().next().value; @@ -821,16 +823,15 @@ export default class App extends Component { return { buffers, activeBuffer }; }); - var client = this.clients.get(buf.server); - var disconnectAll = client && !client.params.bouncerNetwork && client.enabledCaps["soju.im/bouncer-networks"]; + let disconnectAll = client && !client.params.bouncerNetwork && client.enabledCaps["soju.im/bouncer-networks"]; this.disconnect(buf.server); this.setState((state) => { - var servers = new Map(state.servers); + let servers = new Map(state.servers); servers.delete(buf.server); - var connectForm = state.connectForm; + let connectForm = state.connectForm; if (servers.size == 0) { connectForm = true; } @@ -839,7 +840,7 @@ export default class App extends Component { }); if (disconnectAll) { - for (var serverID of this.clients.keys()) { + for (let serverID of this.clients.keys()) { this.close({ server: serverID, name: SERVER_BUFFER }); } } @@ -850,13 +851,12 @@ export default class App extends Component { } break; case BufferType.CHANNEL: - var client = this.clients.get(buf.server); client.send({ command: "PART", params: [buf.name] }); // fallthrough case BufferType.NICK: this.switchBuffer({ name: SERVER_BUFFER }); this.setState((state) => { - var buffers = new Map(state.buffers); + let buffers = new Map(state.buffers); buffers.delete(buf.id); return { buffers }; }); @@ -868,11 +868,11 @@ export default class App extends Component { } executeCommand(s) { - var parts = s.split(" "); - var name = parts[0].toLowerCase().slice(1); - var args = parts.slice(1); + let parts = s.split(" "); + let name = parts[0].toLowerCase().slice(1); + let args = parts.slice(1); - var cmd = commands[name]; + let cmd = commands[name]; if (!cmd) { this.setState({ error: `Unknown command "${name}" (run "/help" to get a command list)` }); return; @@ -892,10 +892,10 @@ export default class App extends Component { return; } - var serverID = State.getActiveServerID(this.state); - var client = this.clients.get(serverID); + let serverID = State.getActiveServerID(this.state); + let client = this.clients.get(serverID); - var msg = { command: "PRIVMSG", params: [target, text] }; + let msg = { command: "PRIVMSG", params: [target, text] }; client.send(msg); if (!client.enabledCaps["echo-message"]) { @@ -916,7 +916,7 @@ export default class App extends Component { return; } - var buf = this.state.buffers.get(this.state.activeBuffer); + let buf = this.state.buffers.get(this.state.activeBuffer); if (!buf) { return; } @@ -931,7 +931,7 @@ export default class App extends Component { toggleBufferList() { this.setState((state) => { - var openPanels = { + let openPanels = { ...state.openPanels, bufferList: !state.openPanels.bufferList, }; @@ -941,7 +941,7 @@ export default class App extends Component { toggleMemberList() { this.setState((state) => { - var openPanels = { + let openPanels = { ...state.openPanels, memberList: !state.openPanels.memberList, }; @@ -951,7 +951,7 @@ export default class App extends Component { closeBufferList() { this.setState((state) => { - var openPanels = { + let openPanels = { ...state.openPanels, bufferList: false, }; @@ -961,7 +961,7 @@ export default class App extends Component { closeMemberList() { this.setState((state) => { - var openPanels = { + let openPanels = { ...state.openPanels, memberList: false, }; @@ -974,7 +974,7 @@ export default class App extends Component { } handleJoinSubmit(data) { - var client = this.clients.get(this.state.joinDialog.server); + let client = this.clients.get(this.state.joinDialog.server); this.switchToChannel = data.channel; client.send({ command: "JOIN", params: [data.channel] }); @@ -985,8 +985,8 @@ export default class App extends Component { autocomplete(prefix) { function fromList(l, prefix) { prefix = prefix.toLowerCase(); - var repl = null; - for (var item of l) { + let repl = null; + for (let item of l) { if (item.toLowerCase().startsWith(prefix)) { if (repl) { return null; @@ -998,14 +998,14 @@ export default class App extends Component { } if (prefix.startsWith("/")) { - var repl = fromList(Object.keys(commands), prefix.slice(1)); + let repl = fromList(Object.keys(commands), prefix.slice(1)); if (repl) { repl = "/" + repl; } return repl; } - var buf = this.state.buffers.get(this.state.activeBuffer); + let buf = this.state.buffers.get(this.state.activeBuffer); if (!buf || !buf.members) { return null; } @@ -1017,12 +1017,12 @@ export default class App extends Component { } handleBufferScrollTop() { - var buf = this.state.buffers.get(this.state.activeBuffer); + let buf = this.state.buffers.get(this.state.activeBuffer); if (!buf || buf.type == BufferType.SERVER) { return; } - var client = this.clients.get(buf.server); + let client = this.clients.get(buf.server); if (!client || !client.enabledCaps["draft/chathistory"] || !client.enabledCaps["server-time"]) { return; @@ -1031,7 +1031,7 @@ export default class App extends Component { return; } - var before; + let before; if (buf.messages.length > 0) { before = buf.messages[0].tags["time"]; } else { @@ -1055,9 +1055,9 @@ export default class App extends Component { } handleManageNetworkClick(serverID) { - var server = this.state.servers.get(serverID); - var bouncerNetID = server.isupport.get("BOUNCER_NETID"); - var bouncerNetwork = this.state.bouncerNetworks.get(bouncerNetID); + let server = this.state.servers.get(serverID); + let bouncerNetID = server.isupport.get("BOUNCER_NETID"); + let bouncerNetwork = this.state.bouncerNetworks.get(bouncerNetID); this.setState({ dialog: "network", networkDialog: { @@ -1068,7 +1068,7 @@ export default class App extends Component { } handleNetworkSubmit(attrs) { - var client = this.clients.values().next().value; + let client = this.clients.values().next().value; if (this.state.networkDialog && this.state.networkDialog.id) { if (Object.keys(attrs).length == 0) { @@ -1092,7 +1092,7 @@ export default class App extends Component { } handleNetworkRemove() { - var client = this.clients.values().next().value; + let client = this.clients.values().next().value; client.send({ command: "BOUNCER", @@ -1103,29 +1103,29 @@ export default class App extends Component { } handleMode(serverID, msg) { - var client = this.clients.get(serverID); - var chanmodes = client.isupport.get("CHANMODES") || irc.STD_CHANMODES; - var prefix = client.isupport.get("PREFIX") || ""; + let client = this.clients.get(serverID); + let chanmodes = client.isupport.get("CHANMODES") || irc.STD_CHANMODES; + let prefix = client.isupport.get("PREFIX") || ""; - var prefixByMode = new Map(irc.parseMembershipModes(prefix).map((membership) => { + let prefixByMode = new Map(irc.parseMembershipModes(prefix).map((membership) => { return [membership.mode, membership.prefix]; })); - var typeByMode = new Map(); - var [a, b, c, d] = chanmodes.split(","); + let typeByMode = new Map(); + let [a, b, c, d] = chanmodes.split(","); Array.from(a).forEach((mode) => typeByMode.set(mode, "A")); Array.from(b).forEach((mode) => typeByMode.set(mode, "B")); Array.from(c).forEach((mode) => typeByMode.set(mode, "C")); Array.from(d).forEach((mode) => typeByMode.set(mode, "D")); prefixByMode.forEach((prefix, mode) => typeByMode.set(mode, "B")); - var channel = msg.params[0]; - var change = msg.params[1]; - var args = msg.params.slice(2); + let channel = msg.params[0]; + let change = msg.params[1]; + let args = msg.params.slice(2); - var plusMinus = null; - var j = 0; - for (var i = 0; i < change.length; i++) { + let plusMinus = null; + let j = 0; + for (let i = 0; i < change.length; i++) { if (change[i] === "+" || change[i] === "-") { plusMinus = change[i]; continue; @@ -1134,15 +1134,15 @@ export default class App extends Component { throw new Error("malformed mode string: missing plus/minus"); } - var mode = change[i]; - var add = plusMinus === "+"; + let mode = change[i]; + let add = plusMinus === "+"; - var modeType = typeByMode.get(mode); + let modeType = typeByMode.get(mode); if (!modeType) { continue; } - var arg = null; + let arg = null; if (modeType === "A" || modeType === "B" || (modeType === "C" && add)) { arg = args[j]; j++; @@ -1159,18 +1159,18 @@ export default class App extends Component { } handlePrefixChange(serverID, channel, nick, letter, add) { - var client = this.clients.get(serverID); - var prefix = client.isupport.get("PREFIX") || ""; + let client = this.clients.get(serverID); + let prefix = client.isupport.get("PREFIX") || ""; - var prefixPrivs = new Map(irc.parseMembershipModes(prefix).map((membership, i) => { + let prefixPrivs = new Map(irc.parseMembershipModes(prefix).map((membership, i) => { return [membership.prefix, i]; })); this.setBufferState({ server: serverID, name: channel }, (buf) => { - var members = new irc.CaseMapMap(buf.members); - var membership = members.get(nick); + let members = new irc.CaseMapMap(buf.members); + let membership = members.get(nick); if (add) { - var i = membership.indexOf(letter); + let i = membership.indexOf(letter); if (i < 0) { membership += letter; } @@ -1190,24 +1190,24 @@ export default class App extends Component { } render() { - var activeBuffer = null, activeServer = null, activeBouncerNetwork = null; - var isBouncer = false; + let activeBuffer = null, activeServer = null, activeBouncerNetwork = null; + let isBouncer = false; if (this.state.buffers.get(this.state.activeBuffer)) { activeBuffer = this.state.buffers.get(this.state.activeBuffer); activeServer = this.state.servers.get(activeBuffer.server); - var activeClient = this.clients.get(activeBuffer.server); + let activeClient = this.clients.get(activeBuffer.server); isBouncer = activeClient && activeClient.enabledCaps["soju.im/bouncer-networks"]; - var bouncerNetID = activeServer.isupport.get("BOUNCER_NETID"); + let bouncerNetID = activeServer.isupport.get("BOUNCER_NETID"); if (bouncerNetID) { activeBouncerNetwork = this.state.bouncerNetworks.get(bouncerNetID); } } if (this.state.connectForm) { - var status = activeServer ? activeServer.status : ServerStatus.DISCONNECTED; - var connecting = status === ServerStatus.CONNECTING || status === ServerStatus.REGISTERING; + let status = activeServer ? activeServer.status : ServerStatus.DISCONNECTED; + let connecting = status === ServerStatus.CONNECTING || status === ServerStatus.REGISTERING; // TODO: using key=connectParams trashes the ConnectForm state on update return html`
@@ -1223,7 +1223,7 @@ export default class App extends Component { `; } - var bufferHeader = null; + let bufferHeader = null; if (activeBuffer) { bufferHeader = html`
@@ -1242,7 +1242,7 @@ export default class App extends Component { `; } - var memberList = null; + let memberList = null; if (activeBuffer && activeBuffer.type == BufferType.CHANNEL) { memberList = html`
<${NetworkForm} @@ -1299,7 +1299,7 @@ export default class App extends Component { break; } - var error = null; + let error = null; if (this.state.error) { error = html`

@@ -1310,7 +1310,7 @@ export default class App extends Component { `; } - var composerReadOnly = false; + let composerReadOnly = false; if (activeBuffer && activeBuffer.type === BufferType.SERVER) { composerReadOnly = true; } diff --git a/components/buffer-header.js b/components/buffer-header.js index 944a4e0..a4def90 100644 --- a/components/buffer-header.js +++ b/components/buffer-header.js @@ -10,12 +10,12 @@ const UserStatus = { }; function NickStatus(props) { - var textMap = { + let textMap = { [UserStatus.HERE]: "User is online", [UserStatus.GONE]: "User is away", [UserStatus.OFFLINE]: "User is offline", }; - var text = textMap[props.status]; + let text = textMap[props.status]; return html``; } @@ -37,7 +37,7 @@ export default function BufferHeader(props) { props.onManageNetwork(); } - var description = null, actions = null; + let description = null, actions = null; switch (props.buffer.type) { case BufferType.SERVER: switch (props.server.status) { @@ -65,7 +65,7 @@ export default function BufferHeader(props) { break; } } else if (props.buffer.serverInfo) { - var serverInfo = props.buffer.serverInfo; + let serverInfo = props.buffer.serverInfo; description = `Connected to ${serverInfo.name}`; } else { description = "Connected"; @@ -126,11 +126,11 @@ export default function BufferHeader(props) { break; case BufferType.NICK: if (props.buffer.who) { - var who = props.buffer.who; + let who = props.buffer.who; - var realname = stripANSI(who.realname || ""); + let realname = stripANSI(who.realname || ""); - var status = UserStatus.HERE; + let status = UserStatus.HERE; if (who.away) { status = UserStatus.GONE; } @@ -154,7 +154,7 @@ export default function BufferHeader(props) { break; } - var name = props.buffer.name; + let name = props.buffer.name; if (props.buffer.type == BufferType.SERVER) { name = getServerName(props.server, props.bouncerNetwork, props.isBouncer); } diff --git a/components/buffer-list.js b/components/buffer-list.js index 6f26a21..b9dc907 100644 --- a/components/buffer-list.js +++ b/components/buffer-list.js @@ -8,12 +8,12 @@ function BufferItem(props) { props.onClick(); } - var name = props.buffer.name; + let name = props.buffer.name; if (props.buffer.type == BufferType.SERVER) { name = getServerName(props.server, props.bouncerNetwork, props.isBouncer); } - var classes = ["type-" + props.buffer.type]; + let classes = ["type-" + props.buffer.type]; if (props.active) { classes.push("active"); } @@ -30,11 +30,11 @@ function BufferItem(props) { export default function BufferList(props) { - var items = Array.from(props.buffers.values()).map((buf) => { - var server = props.servers.get(buf.server); + let items = Array.from(props.buffers.values()).map((buf) => { + let server = props.servers.get(buf.server); - var bouncerNetwork = null; - var bouncerNetID = server.isupport.get("BOUNCER_NETID"); + let bouncerNetwork = null; + let bouncerNetID = server.isupport.get("BOUNCER_NETID"); if (bouncerNetID) { bouncerNetwork = props.bouncerNetworks.get(bouncerNetID); } diff --git a/components/buffer.js b/components/buffer.js index 1e51f00..ddf8e54 100644 --- a/components/buffer.js +++ b/components/buffer.js @@ -5,8 +5,8 @@ import { strip as stripANSI } from "../lib/ansi.js"; import { BufferType, getNickURL, getChannelURL, getMessageURL } from "../state.js"; function djb2(s) { - var hash = 5381; - for (var i = 0; i < s.length; i++) { + let hash = 5381; + for (let i = 0; i < s.length; i++) { hash = (hash << 5) + hash + s.charCodeAt(i); hash = hash >>> 0; // convert to uint32 } @@ -19,7 +19,7 @@ function Nick(props) { props.onClick(); } - var colorIndex = djb2(props.nick) % 16 + 1; + let colorIndex = djb2(props.nick) % 16 + 1; return html` ${props.nick} `; @@ -30,10 +30,10 @@ function Timestamp({ date, url }) { return html`--:--:--`; } - var hh = date.getHours().toString().padStart(2, "0"); - var mm = date.getMinutes().toString().padStart(2, "0"); - var ss = date.getSeconds().toString().padStart(2, "0"); - var timestamp = `${hh}:${mm}:${ss}`; + let hh = date.getHours().toString().padStart(2, "0"); + let mm = date.getMinutes().toString().padStart(2, "0"); + let ss = date.getSeconds().toString().padStart(2, "0"); + let timestamp = `${hh}:${mm}:${ss}`; return html` event.preventDefault()}>${timestamp} `; @@ -62,10 +62,10 @@ class LogLine extends Component { } render() { - var msg = this.props.message; + let msg = this.props.message; - var onNickClick = this.props.onNickClick; - var onChannelClick = this.props.onChannelClick; + let onNickClick = this.props.onNickClick; + let onChannelClick = this.props.onChannelClick; function createNick(nick) { return html` <${Nick} nick=${nick} onClick=${() => onNickClick(nick)}/> @@ -83,14 +83,14 @@ class LogLine extends Component { `; } - var lineClass = ""; - var content; + let lineClass = ""; + let content; switch (msg.command) { case "NOTICE": case "PRIVMSG": - var text = msg.params[1]; + let text = msg.params[1]; - var ctcp = irc.parseCTCP(msg); + let ctcp = irc.parseCTCP(msg); if (ctcp) { if (ctcp.command == "ACTION") { lineClass = "me-tell"; @@ -102,7 +102,7 @@ class LogLine extends Component { } } else { lineClass = "talk"; - var prefix = "<", suffix = ">"; + let prefix = "<", suffix = ">"; if (msg.command == "NOTICE") { prefix = suffix = "-"; } @@ -129,7 +129,7 @@ class LogLine extends Component { `; break; case "NICK": - var newNick = msg.params[0]; + let newNick = msg.params[0]; content = html` ${createNick(msg.prefix.name)} is now known as ${createNick(newNick)} `; @@ -145,14 +145,14 @@ class LogLine extends Component { `; break; case "TOPIC": - var topic = msg.params[1]; + let topic = msg.params[1]; content = html` ${createNick(msg.prefix.name)} changed the topic to: ${linkify(stripANSI(topic), onChannelClick)} `; break; case "INVITE": - var invitee = msg.params[0]; - var channel = msg.params[1]; + let invitee = msg.params[0]; + let channel = msg.params[1]; // TODO: instead of checking buffer type, check if invitee is our nick if (this.props.buffer.type === BufferType.SERVER) { lineClass = "talk"; @@ -193,7 +193,7 @@ function createNickList(nicks, createNick) { return createNick(nicks[0]); } - var l = nicks.slice(0, nicks.length - 1).map((nick, i) => { + let l = nicks.slice(0, nicks.length - 1).map((nick, i) => { if (i === 0) { return createNick(nick); } else { @@ -214,17 +214,17 @@ class FoldGroup extends Component { } render() { - var msgs = this.props.messages; - var buf = this.props.buffer; + let msgs = this.props.messages; + let buf = this.props.buffer; - var onNickClick = this.props.onNickClick; + let onNickClick = this.props.onNickClick; function createNick(nick) { return html` <${Nick} nick=${nick} onClick=${() => onNickClick(nick)}/> `; } - var byCommand = { + let byCommand = { "JOIN": [], "PART": [], "QUIT": [], @@ -234,15 +234,15 @@ class FoldGroup extends Component { byCommand[msg.command].push(msg); }); - var first = true; - var content = []; + let first = true; + let content = []; ["JOIN", "PART", "QUIT"].forEach((cmd) => { if (byCommand[cmd].length === 0) { return; } - var plural = byCommand[cmd].length > 1; - var action; + let plural = byCommand[cmd].length > 1; + let action; switch (cmd) { case "JOIN": action = plural ? "have joined" : "has joined"; @@ -261,7 +261,7 @@ class FoldGroup extends Component { content.push(", "); } - var nicks = byCommand[cmd].map((msg) => msg.prefix.name); + let nicks = byCommand[cmd].map((msg) => msg.prefix.name); content.push(createNickList(nicks, createNick)); content.push(" " + action); @@ -274,16 +274,16 @@ class FoldGroup extends Component { content.push(", "); } - var newNick = msg.params[0]; + let newNick = msg.params[0]; content.push(html` ${createNick(msg.prefix.name)} is now known as ${createNick(newNick)} `); }); - var lastMsg = msgs[msgs.length - 1]; - var firstDate = new Date(msgs[0].tags.time); - var lastDate = new Date(lastMsg.tags.time); - var timestamp = html` + let lastMsg = msgs[msgs.length - 1]; + let firstDate = new Date(msgs[0].tags.time); + let lastDate = new Date(lastMsg.tags.time); + let timestamp = html` <${Timestamp} date=${firstDate} url=${getMessageURL(buf, msgs[0])}/> `; if (lastDate - firstDate > 60 * 100) { @@ -307,7 +307,7 @@ class FoldGroup extends Component { } // Workaround for https://bugs.chromium.org/p/chromium/issues/detail?id=481856 -var notificationsSupported = false; +let notificationsSupported = false; if (window.Notification) { notificationsSupported = true; if (Notification.permission === "default") { @@ -369,11 +369,11 @@ class DateSeparator extends Component { } render() { - var date = this.props.date; - var YYYY = date.getFullYear().toString().padStart(4, "0"); - var MM = (date.getMonth() + 1).toString().padStart(2, "0"); - var DD = date.getDate().toString().padStart(2, "0"); - var text = `${YYYY}-${MM}-${DD}`; + let date = this.props.date; + let YYYY = date.getFullYear().toString().padStart(4, "0"); + let MM = (date.getMonth() + 1).toString().padStart(2, "0"); + let DD = date.getDate().toString().padStart(2, "0"); + let text = `${YYYY}-${MM}-${DD}`; return html`

${text} @@ -396,18 +396,18 @@ export default class Buffer extends Component { } render() { - var buf = this.props.buffer; + let buf = this.props.buffer; if (!buf) { return null; } - var children = []; + let children = []; if (buf.type == BufferType.SERVER) { children.push(html`<${NotificationNagger}/>`); } - var onChannelClick = this.props.onChannelClick; - var onNickClick = this.props.onNickClick; + let onChannelClick = this.props.onChannelClick; + let onNickClick = this.props.onNickClick; function createLogLine(msg) { return html` <${LogLine} @@ -421,8 +421,8 @@ export default class Buffer extends Component { } function createFoldGroup(msgs) { // Filter out PART → JOIN pairs - var partIndexes = new Map(); - var keep = []; + let partIndexes = new Map(); + let keep = []; msgs.forEach((msg, i) => { if (msg.command === "PART" || msg.command === "QUIT") { partIndexes.set(msg.prefix.name, i); @@ -452,18 +452,18 @@ export default class Buffer extends Component { `; } - var hasUnreadSeparator = false; - var prevDate = new Date(); - var foldMessages = []; + let hasUnreadSeparator = false; + let prevDate = new Date(); + let foldMessages = []; buf.messages.forEach((msg) => { - var sep = []; + let sep = []; if (!hasUnreadSeparator && buf.type != BufferType.SERVER && buf.lastReadReceipt && msg.tags.time > buf.lastReadReceipt.time) { sep.push(html`<${UnreadSeparator} key="unread"/>`); hasUnreadSeparator = true; } - var date = new Date(msg.tags.time); + let date = new Date(msg.tags.time); if (!sameDate(prevDate, date)) { sep.push(html`<${DateSeparator} key=${"date-" + date} date=${date}/>`); } diff --git a/components/composer.js b/components/composer.js index 444bbb0..a6d89a6 100644 --- a/components/composer.js +++ b/components/composer.js @@ -34,21 +34,21 @@ export default class Composer extends Component { return; } - var text = this.state.text; - var i; + let text = this.state.text; + let i; for (i = text.length - 1; i >= 0; i--) { if (text[i] === " ") { break; } } - var prefix = text.slice(i + 1); + let prefix = text.slice(i + 1); if (!prefix) { return; } event.preventDefault(); - var repl = this.props.autocomplete(prefix); + let repl = this.props.autocomplete(prefix); if (!repl) { return; } diff --git a/components/connect-form.js b/components/connect-form.js index ac89331..05f8d9c 100644 --- a/components/connect-form.js +++ b/components/connect-form.js @@ -32,8 +32,8 @@ export default class ConnectForm extends Component { } handleChange(event) { - var target = event.target; - var value = target.type == "checkbox" ? target.checked : target.value; + let target = event.target; + let value = target.type == "checkbox" ? target.checked : target.value; this.setState({ [target.name]: value }); } @@ -44,7 +44,7 @@ export default class ConnectForm extends Component { return; } - var params = { + let params = { url: this.state.url, pass: this.state.pass, nick: this.state.nick, @@ -74,9 +74,9 @@ export default class ConnectForm extends Component { } render() { - var disabled = this.props.connecting; + let disabled = this.props.connecting; - var serverURL = null; + let serverURL = null; if (!this.props.params || !this.props.params.url) { serverURL = html`