s/network/server/

Closes: https://todo.sr.ht/~emersion/gamja/46
This commit is contained in:
Simon Ser 2021-06-03 11:46:50 +02:00
parent 63a71e5f5d
commit fe9c483570
5 changed files with 156 additions and 156 deletions

View File

@ -6,7 +6,7 @@ function getActiveClient(app) {
if (!buf) { if (!buf) {
throw new Error("Not connected to server"); throw new Error("Not connected to server");
} }
return app.clients.get(buf.network); return app.clients.get(buf.server);
} }
function getActiveChannel(app) { function getActiveChannel(app) {

View File

@ -13,7 +13,7 @@ import ScrollManager from "./scroll-manager.js";
import Dialog from "./dialog.js"; import Dialog from "./dialog.js";
import { html, Component, createRef } from "../lib/index.js"; import { html, Component, createRef } from "../lib/index.js";
import { strip as stripANSI } from "../lib/ansi.js"; import { strip as stripANSI } from "../lib/ansi.js";
import { SERVER_BUFFER, BufferType, ReceiptType, NetworkStatus, Unread } from "../state.js"; import { SERVER_BUFFER, BufferType, ReceiptType, ServerStatus, Unread } from "../state.js";
import commands from "../commands.js"; import commands from "../commands.js";
import { setup as setupKeybindings } from "../keybindings.js"; import { setup as setupKeybindings } from "../keybindings.js";
import * as store from "../store.js"; import * as store from "../store.js";
@ -118,8 +118,8 @@ function isServerBuffer(buf) {
/* Returns 1 if a should appear after b, -1 if a should appear before b, or /* Returns 1 if a should appear after b, -1 if a should appear before b, or
* 0 otherwise. */ * 0 otherwise. */
function compareBuffers(a, b) { function compareBuffers(a, b) {
if (a.network != b.network) { if (a.server != b.server) {
return a.network > b.network ? 1 : -1; return a.server > b.server ? 1 : -1;
} }
if (isServerBuffer(a) != isServerBuffer(b)) { if (isServerBuffer(a) != isServerBuffer(b)) {
return isServerBuffer(b) ? 1 : -1; return isServerBuffer(b) ? 1 : -1;
@ -143,12 +143,12 @@ function updateState(state, updater) {
return { ...state, ...updated }; return { ...state, ...updated };
} }
function getActiveNetworkID(state) { function getActiveServerID(state) {
var buf = state.buffers.get(state.activeBuffer); var buf = state.buffers.get(state.activeBuffer);
if (!buf) { if (!buf) {
return null; return null;
} }
return buf.network; return buf.server;
} }
function getBuffer(state, id) { function getBuffer(state, id) {
@ -160,20 +160,20 @@ function getBuffer(state, id) {
return state.buffers.get(id.id); return state.buffers.get(id.id);
} }
var netID = id.network, name = id.name; var serverID = id.server, name = id.name;
if (!netID) { if (!serverID) {
netID = getActiveNetworkID(state); serverID = getActiveServerID(state);
} }
var cm = irc.CaseMapping.RFC1459; var cm = irc.CaseMapping.RFC1459;
var network = state.networks.get(netID); var server = state.servers.get(serverID);
if (network) { if (server) {
cm = irc.CaseMapping.byName(network.isupport.get("CASEMAPPING")) || cm; cm = irc.CaseMapping.byName(server.isupport.get("CASEMAPPING")) || cm;
} }
var nameCM = cm(name); var nameCM = cm(name);
for (var buf of state.buffers.values()) { for (var buf of state.buffers.values()) {
if (buf.network === netID && cm(buf.name) === nameCM) { if (buf.server === serverID && cm(buf.name) === nameCM) {
return buf; return buf;
} }
} }
@ -195,7 +195,7 @@ export default class App extends Component {
autoconnect: false, autoconnect: false,
autojoin: [], autojoin: [],
}, },
networks: new Map(), servers: new Map(),
buffers: new Map(), buffers: new Map(),
bouncerNetworks: new Map(), bouncerNetworks: new Map(),
activeBuffer: null, activeBuffer: null,
@ -212,7 +212,7 @@ export default class App extends Component {
receipts = new Map(); receipts = new Map();
buffer = createRef(); buffer = createRef();
composer = createRef(); composer = createRef();
lastNetworkID = 0; lastServerID = 0;
lastBufferID = 0; lastBufferID = 0;
switchToChannel = null; switchToChannel = null;
@ -307,21 +307,21 @@ export default class App extends Component {
this.setState({ error: null }); this.setState({ error: null });
} }
setNetworkState(id, updater, callback) { setServerState(id, updater, callback) {
this.setState((state) => { this.setState((state) => {
var net = state.networks.get(id); var server = state.servers.get(id);
if (!net) { if (!server) {
return; return;
} }
var updated = updateState(net, updater); var updated = updateState(server, updater);
if (!updated) { if (!updated) {
return; return;
} }
var networks = new Map(state.networks); var servers = new Map(state.servers);
networks.set(id, updated); servers.set(id, updated);
return { networks }; return { servers };
}, callback); }, callback);
} }
@ -343,10 +343,10 @@ export default class App extends Component {
}, callback); }, callback);
} }
createBuffer(netID, name, callback) { createBuffer(serverID, name, callback) {
var id = null; var id = null;
this.setState((state) => { this.setState((state) => {
if (getBuffer(state, { network: netID, name })) { if (getBuffer(state, { server: serverID, name })) {
return; return;
} }
@ -362,7 +362,7 @@ export default class App extends Component {
type = BufferType.NICK; type = BufferType.NICK;
} }
var client = this.clients.get(netID); var client = this.clients.get(serverID);
var cm = client ? client.cm : irc.CaseMapping.RFC1459; var cm = client ? client.cm : irc.CaseMapping.RFC1459;
var bufferList = Array.from(state.buffers.values()); var bufferList = Array.from(state.buffers.values());
@ -370,7 +370,7 @@ export default class App extends Component {
id, id,
name, name,
type, type,
network: netID, server: serverID,
serverInfo: null, // if server serverInfo: null, // if server
topic: null, // if channel topic: null, // if channel
members: new irc.CaseMapMap(null, cm), // if channel members: new irc.CaseMapMap(null, cm), // if channel
@ -465,8 +465,8 @@ export default class App extends Component {
return last; return last;
} }
addMessage(netID, bufName, msg) { addMessage(serverID, bufName, msg) {
var client = this.clients.get(netID); var client = this.clients.get(serverID);
msg.key = messagesCount; msg.key = messagesCount;
messagesCount++; messagesCount++;
@ -511,7 +511,7 @@ export default class App extends Component {
}); });
notif.addEventListener("click", () => { notif.addEventListener("click", () => {
// TODO: scroll to message // TODO: scroll to message
this.switchBuffer({ network: netID, name: target }); this.switchBuffer({ server: serverID, name: target });
}); });
} }
} }
@ -531,22 +531,22 @@ export default class App extends Component {
notif.addEventListener("click", (event) => { notif.addEventListener("click", (event) => {
if (event.action === "accept") { if (event.action === "accept") {
this.setReceipt(bufName, ReceiptType.READ, msg); this.setReceipt(bufName, ReceiptType.READ, msg);
this.open(channel, netID); this.open(channel, serverID);
} else { } else {
// TODO: scroll to message // TODO: scroll to message
this.switchBuffer({ network: netID, name: bufName }); this.switchBuffer({ server: serverID, name: bufName });
} }
}); });
} }
} }
if (!client.isMyNick(msg.prefix.name) && (msg.command != "PART" && msg.comand != "QUIT")) { if (!client.isMyNick(msg.prefix.name) && (msg.command != "PART" && msg.comand != "QUIT")) {
this.createBuffer(netID, bufName); this.createBuffer(serverID, bufName);
} }
this.setReceipt(bufName, ReceiptType.DELIVERED, msg); this.setReceipt(bufName, ReceiptType.DELIVERED, msg);
this.setBufferState({ network: netID, name: bufName }, (buf) => { this.setBufferState({ server: serverID, name: bufName }, (buf) => {
// TODO: set unread if scrolled up // TODO: set unread if scrolled up
var unread = buf.unread; var unread = buf.unread;
var lastReadReceipt = buf.lastReadReceipt; var lastReadReceipt = buf.lastReadReceipt;
@ -562,38 +562,38 @@ export default class App extends Component {
} }
connect(params) { connect(params) {
this.lastNetworkID++; this.lastServerID++;
var netID = this.lastNetworkID; var serverID = this.lastServerID;
this.setState((state) => { this.setState((state) => {
var networks = new Map(state.networks); var servers = new Map(state.servers);
networks.set(netID, { servers.set(serverID, {
id: netID, id: serverID,
status: NetworkStatus.CONNECTING, status: ServerStatus.CONNECTING,
isupport: new Map(), isupport: new Map(),
}); });
return { networks }; return { servers };
}); });
this.setState({ connectParams: params }); this.setState({ connectParams: params });
var client = new Client(fillConnectParams(params)); var client = new Client(fillConnectParams(params));
this.clients.set(netID, client); this.clients.set(serverID, client);
client.addEventListener("status", () => { client.addEventListener("status", () => {
this.setNetworkState(netID, { status: client.status }); this.setServerState(serverID, { status: client.status });
}); });
client.addEventListener("message", (event) => { client.addEventListener("message", (event) => {
this.handleMessage(netID, event.detail.message); this.handleMessage(serverID, event.detail.message);
}); });
client.addEventListener("error", (event) => { client.addEventListener("error", (event) => {
this.setState({ error: event.detail }); this.setState({ error: event.detail });
}); });
this.createBuffer(netID, SERVER_BUFFER); this.createBuffer(serverID, SERVER_BUFFER);
if (!this.state.activeBuffer) { if (!this.state.activeBuffer) {
this.switchBuffer({ network: netID, name: SERVER_BUFFER }); this.switchBuffer({ server: serverID, name: SERVER_BUFFER });
} }
if (params.autojoin.length > 0) { if (params.autojoin.length > 0) {
@ -605,30 +605,30 @@ export default class App extends Component {
} }
} }
disconnect(netID) { disconnect(serverID) {
if (!netID) { if (!serverID) {
netID = getActiveNetworkID(this.state); serverID = getActiveServerID(this.state);
} }
var client = this.clients.get(netID); var client = this.clients.get(serverID);
if (client) { if (client) {
this.clients.delete(netID); this.clients.delete(serverID);
client.disconnect(); client.disconnect();
} }
} }
reconnect(netID) { reconnect(serverID) {
if (!netID) { if (!serverID) {
netID = getActiveNetworkID(this.state); serverID = getActiveServerID(this.state);
} }
var client = this.clients.get(netID); var client = this.clients.get(serverID);
if (client) { if (client) {
client.reconnect(); client.reconnect();
} }
} }
networkFromBouncerNetwork(bouncerNetworkID) { serverFromBouncerNetwork(bouncerNetworkID) {
for (var [id, client] of this.clients) { for (var [id, client] of this.clients) {
if (client.params.bouncerNetwork === bouncerNetworkID) { if (client.params.bouncerNetwork === bouncerNetworkID) {
return id; return id;
@ -637,8 +637,8 @@ export default class App extends Component {
return null; return null;
} }
handleMessage(netID, msg) { handleMessage(serverID, msg) {
var client = this.clients.get(netID); var client = this.clients.get(serverID);
switch (msg.command) { switch (msg.command) {
case irc.RPL_WELCOME: case irc.RPL_WELCOME:
if (this.state.connectParams.autojoin.length > 0) { if (this.state.connectParams.autojoin.length > 0) {
@ -669,16 +669,16 @@ export default class App extends Component {
name: msg.params[1], name: msg.params[1],
version: msg.params[2], version: msg.params[2],
}; };
this.setBufferState({ network: netID, name: SERVER_BUFFER }, { serverInfo }); this.setBufferState({ server: serverID, name: SERVER_BUFFER }, { serverInfo });
break; break;
case irc.RPL_ISUPPORT: case irc.RPL_ISUPPORT:
this.setNetworkState(netID, (network) => { this.setServerState(serverID, (server) => {
return { isupport: new Map(client.isupport) }; return { isupport: new Map(client.isupport) };
}); });
this.setState((state) => { this.setState((state) => {
var buffers = new Map(state.buffers); var buffers = new Map(state.buffers);
state.buffers.forEach((buf) => { state.buffers.forEach((buf) => {
if (buf.network != netID) { if (buf.server != serverID) {
return; return;
} }
var members = new irc.CaseMapMap(buf.members, client.cm); var members = new irc.CaseMapMap(buf.members, client.cm);
@ -690,13 +690,13 @@ export default class App extends Component {
case irc.RPL_NOTOPIC: case irc.RPL_NOTOPIC:
var channel = msg.params[1]; var channel = msg.params[1];
this.setBufferState({ network: netID, name: channel }, { topic: null }); this.setBufferState({ server: serverID, name: channel }, { topic: null });
break; break;
case irc.RPL_TOPIC: case irc.RPL_TOPIC:
var channel = msg.params[1]; var channel = msg.params[1];
var topic = msg.params[2]; var topic = msg.params[2];
this.setBufferState({ network: netID, name: channel }, { topic }); this.setBufferState({ server: serverID, name: channel }, { topic });
break; break;
case irc.RPL_TOPICWHOTIME: case irc.RPL_TOPICWHOTIME:
// Ignore // Ignore
@ -705,7 +705,7 @@ export default class App extends Component {
var channel = msg.params[2]; var channel = msg.params[2];
var membersList = msg.params[3].split(" "); var membersList = msg.params[3].split(" ");
this.setBufferState({ network: netID, name: channel }, (buf) => { this.setBufferState({ server: serverID, name: channel }, (buf) => {
var members = new irc.CaseMapMap(buf.members); var members = new irc.CaseMapMap(buf.members);
membersList.forEach((s) => { membersList.forEach((s) => {
var member = irc.parseMembership(s); var member = irc.parseMembership(s);
@ -728,15 +728,15 @@ export default class App extends Component {
realname: last.slice(last.indexOf(" ") + 1), realname: last.slice(last.indexOf(" ") + 1),
}; };
this.setBufferState({ network: netID, name: who.nick }, { who, offline: false }); this.setBufferState({ server: serverID, name: who.nick }, { who, offline: false });
this.addMessage(netID, SERVER_BUFFER, msg); this.addMessage(serverID, SERVER_BUFFER, msg);
break; break;
case irc.RPL_ENDOFWHO: case irc.RPL_ENDOFWHO:
var target = msg.params[1]; var target = msg.params[1];
if (!this.isChannel(target) && target.indexOf("*") < 0) { if (!this.isChannel(target) && target.indexOf("*") < 0) {
// Not a channel nor a mask, likely a nick // Not a channel nor a mask, likely a nick
this.setBufferState({ network: netID, name: target }, (buf) => { this.setBufferState({ server: serverID, name: target }, (buf) => {
// TODO: mark user offline if we have old WHO info but this // TODO: mark user offline if we have old WHO info but this
// WHO reply is empty // WHO reply is empty
if (buf.who) { if (buf.who) {
@ -746,14 +746,14 @@ export default class App extends Component {
}); });
} }
this.addMessage(netID, SERVER_BUFFER, msg); this.addMessage(serverID, SERVER_BUFFER, msg);
break; break;
case "MODE": case "MODE":
var target = msg.params[0]; var target = msg.params[0];
if (this.isChannel(target)) { if (this.isChannel(target)) {
this.addMessage(netID, target, msg); this.addMessage(serverID, target, msg);
} }
this.handleMode(netID, msg); this.handleMode(serverID, msg);
break; break;
case "NOTICE": case "NOTICE":
case "PRIVMSG": case "PRIVMSG":
@ -765,34 +765,34 @@ export default class App extends Component {
target = msg.prefix.name; target = msg.prefix.name;
} }
} }
this.addMessage(netID, target, msg); this.addMessage(serverID, target, msg);
break; break;
case "JOIN": case "JOIN":
var channel = msg.params[0]; var channel = msg.params[0];
this.createBuffer(netID, channel); this.createBuffer(serverID, channel);
this.setBufferState({ network: netID, name: channel }, (buf) => { this.setBufferState({ server: serverID, name: channel }, (buf) => {
var members = new irc.CaseMapMap(buf.members); var members = new irc.CaseMapMap(buf.members);
members.set(msg.prefix.name, ""); members.set(msg.prefix.name, "");
return { members }; return { members };
}); });
if (!client.isMyNick(msg.prefix.name)) { if (!client.isMyNick(msg.prefix.name)) {
this.addMessage(netID, channel, msg); this.addMessage(serverID, channel, msg);
} }
if (channel == this.switchToChannel) { if (channel == this.switchToChannel) {
this.switchBuffer({ network: netID, name: channel }); this.switchBuffer({ server: serverID, name: channel });
this.switchToChannel = null; this.switchToChannel = null;
} }
break; break;
case "PART": case "PART":
var channel = msg.params[0]; var channel = msg.params[0];
this.setBufferState({ network: netID, name: channel }, (buf) => { this.setBufferState({ server: serverID, name: channel }, (buf) => {
var members = new irc.CaseMapMap(buf.members); var members = new irc.CaseMapMap(buf.members);
members.delete(msg.prefix.name); members.delete(msg.prefix.name);
return { members }; return { members };
}); });
this.addMessage(netID, channel, msg); this.addMessage(serverID, channel, msg);
if (client.isMyNick(msg.prefix.name)) { if (client.isMyNick(msg.prefix.name)) {
this.receipts.delete(channel); this.receipts.delete(channel);
@ -803,12 +803,12 @@ export default class App extends Component {
var channel = msg.params[0]; var channel = msg.params[0];
var user = msg.params[1]; var user = msg.params[1];
this.setBufferState({ network: netID, name: channel }, (buf) => { this.setBufferState({ server: serverID, name: channel }, (buf) => {
var members = new irc.CaseMapMap(buf.members); var members = new irc.CaseMapMap(buf.members);
members.delete(user); members.delete(user);
return { members }; return { members };
}); });
this.addMessage(netID, channel, msg); this.addMessage(serverID, channel, msg);
if (client.isMyNick(msg.prefix.name)) { if (client.isMyNick(msg.prefix.name)) {
this.receipts.delete(channel); this.receipts.delete(channel);
@ -820,7 +820,7 @@ export default class App extends Component {
this.setState((state) => { this.setState((state) => {
var buffers = new Map(state.buffers); var buffers = new Map(state.buffers);
state.buffers.forEach((buf) => { state.buffers.forEach((buf) => {
if (buf.network != netID) { if (buf.server != serverID) {
return; return;
} }
if (!buf.members.has(msg.prefix.name) && client.cm(buf.name) !== client.cm(msg.prefix.name)) { if (!buf.members.has(msg.prefix.name) && client.cm(buf.name) !== client.cm(msg.prefix.name)) {
@ -834,7 +834,7 @@ export default class App extends Component {
}); });
return { buffers }; return { buffers };
}); });
affectedBuffers.forEach((name) => this.addMessage(netID, name, msg)); affectedBuffers.forEach((name) => this.addMessage(serverID, name, msg));
break; break;
case "NICK": case "NICK":
var newNick = msg.params[0]; var newNick = msg.params[0];
@ -843,7 +843,7 @@ export default class App extends Component {
this.setState((state) => { this.setState((state) => {
var buffers = new Map(state.buffers); var buffers = new Map(state.buffers);
state.buffers.forEach((buf) => { state.buffers.forEach((buf) => {
if (buf.network != netID) { if (buf.server != serverID) {
return; return;
} }
if (!buf.members.has(msg.prefix.name)) { if (!buf.members.has(msg.prefix.name)) {
@ -857,10 +857,10 @@ export default class App extends Component {
}); });
return { buffers }; return { buffers };
}); });
affectedBuffers.forEach((name) => this.addMessage(netID, name, msg)); affectedBuffers.forEach((name) => this.addMessage(serverID, name, msg));
break; break;
case "SETNAME": case "SETNAME":
this.setBufferState({ network: netID, name: msg.prefix.name }, (buf) => { this.setBufferState({ server: serverID, name: msg.prefix.name }, (buf) => {
var who = { ...buf.who, realname: msg.params[0] }; var who = { ...buf.who, realname: msg.params[0] };
return { who } return { who }
}); });
@ -869,24 +869,24 @@ export default class App extends Component {
var channel = msg.params[0]; var channel = msg.params[0];
var topic = msg.params[1]; var topic = msg.params[1];
this.setBufferState({ network: netID, name: channel }, { topic }); this.setBufferState({ server: serverID, name: channel }, { topic });
this.addMessage(netID, channel, msg); this.addMessage(serverID, channel, msg);
break; break;
case "INVITE": case "INVITE":
var channel = msg.params[1]; var channel = msg.params[1];
// TODO: find a more reliable way to do this // TODO: find a more reliable way to do this
var bufName = channel; var bufName = channel;
if (!getBuffer(this.state, { network: netID, name: channel })) { if (!getBuffer(this.state, { server: serverID, name: channel })) {
bufName = SERVER_BUFFER; bufName = SERVER_BUFFER;
} }
this.addMessage(netID, bufName, msg); this.addMessage(serverID, bufName, msg);
break; break;
case "AWAY": case "AWAY":
var awayMessage = msg.params[0]; var awayMessage = msg.params[0];
this.setBufferState({ network: netID, name: msg.prefix.name }, (buf) => { this.setBufferState({ server: serverID, name: msg.prefix.name }, (buf) => {
var who = { ...buf.who, away: !!awayMessage }; var who = { ...buf.who, away: !!awayMessage };
return { who }; return { who };
}); });
@ -922,9 +922,9 @@ export default class App extends Component {
return { bouncerNetworks }; return { bouncerNetworks };
}, () => { }, () => {
if (!attrs) { if (!attrs) {
var netID = this.networkFromBouncerNetwork(id); var serverID = this.serverFromBouncerNetwork(id);
if (netID) { if (serverID) {
this.close({ network: netID, name: SERVER_BUFFER }); this.close({ server: serverID, name: SERVER_BUFFER });
} }
} else if (isNew) { } else if (isNew) {
this.connect({ this.connect({
@ -937,7 +937,7 @@ export default class App extends Component {
case irc.RPL_BANLIST: case irc.RPL_BANLIST:
case irc.RPL_ENDOFBANLIST: case irc.RPL_ENDOFBANLIST:
var channel = msg.params[1]; var channel = msg.params[1];
this.addMessage(netID, channel, msg); this.addMessage(serverID, channel, msg);
break; break;
case "CAP": case "CAP":
case "AUTHENTICATE": case "AUTHENTICATE":
@ -953,7 +953,7 @@ export default class App extends Component {
var description = msg.params[msg.params.length - 1]; var description = msg.params[msg.params.length - 1];
this.setState({ error: description }); this.setState({ error: description });
} }
this.addMessage(netID, SERVER_BUFFER, msg); this.addMessage(serverID, SERVER_BUFFER, msg);
} }
} }
@ -970,8 +970,8 @@ export default class App extends Component {
} }
handleChannelClick(channel) { handleChannelClick(channel) {
var netID = getActiveNetworkID(this.state); var serverID = getActiveServerID(this.state);
var buf = getBuffer(this.state, { network: netID, name: channel }); var buf = getBuffer(this.state, { server: serverID, name: channel });
if (buf) { if (buf) {
this.switchBuffer(buf.id); this.switchBuffer(buf.id);
} else { } else {
@ -996,20 +996,20 @@ export default class App extends Component {
}); });
} }
open(target, netID) { open(target, serverID) {
if (!netID) { if (!serverID) {
netID = getActiveNetworkID(this.state); serverID = getActiveServerID(this.state);
} }
var client = this.clients.get(netID); var client = this.clients.get(serverID);
if (this.isChannel(target)) { if (this.isChannel(target)) {
this.switchToChannel = target; this.switchToChannel = target;
client.send({ command: "JOIN", params: [target] }); client.send({ command: "JOIN", params: [target] });
} else { } else {
client.who(target); client.who(target);
this.createBuffer(netID, target); this.createBuffer(serverID, target);
this.switchBuffer({ network: netID, name: target }); this.switchBuffer({ server: serverID, name: target });
} }
} }
@ -1024,13 +1024,13 @@ export default class App extends Component {
this.setState((state) => { this.setState((state) => {
var buffers = new Map(state.buffers); var buffers = new Map(state.buffers);
for (var [id, b] of state.buffers) { for (var [id, b] of state.buffers) {
if (b.network === buf.network) { if (b.server === buf.server) {
buffers.delete(id); buffers.delete(id);
} }
} }
var activeBuffer = state.activeBuffer; var activeBuffer = state.activeBuffer;
if (activeBuffer && state.buffers.get(activeBuffer).network === buf.network) { if (activeBuffer && state.buffers.get(activeBuffer).server === buf.server) {
if (buffers.size > 0) { if (buffers.size > 0) {
activeBuffer = buffers.keys().next().value; activeBuffer = buffers.keys().next().value;
} else { } else {
@ -1041,30 +1041,30 @@ export default class App extends Component {
return { buffers, activeBuffer }; return { buffers, activeBuffer };
}); });
var client = this.clients.get(buf.network); var client = this.clients.get(buf.server);
var disconnectAll = client && !client.params.bouncerNetwork && client.enabledCaps["soju.im/bouncer-networks"]; var disconnectAll = client && !client.params.bouncerNetwork && client.enabledCaps["soju.im/bouncer-networks"];
this.disconnect(buf.network); this.disconnect(buf.server);
this.setState((state) => { this.setState((state) => {
var networks = new Map(state.networks); var servers = new Map(state.servers);
networks.delete(buf.network); servers.delete(buf.server);
return { networks }; return { servers };
}); });
if (disconnectAll) { if (disconnectAll) {
for (var netID of this.clients.keys()) { for (var serverID of this.clients.keys()) {
this.close({ network: netID, name: SERVER_BUFFER }); this.close({ server: serverID, name: SERVER_BUFFER });
} }
} }
// TODO: only clear local storage if this network is stored there // TODO: only clear local storage if this server is stored there
if (buf.network == 1) { if (buf.server == 1) {
store.autoconnect.put(null); store.autoconnect.put(null);
} }
break; break;
case BufferType.CHANNEL: case BufferType.CHANNEL:
var client = this.clients.get(buf.network); var client = this.clients.get(buf.server);
client.send({ command: "PART", params: [buf.name] }); client.send({ command: "PART", params: [buf.name] });
// fallthrough // fallthrough
case BufferType.NICK: case BufferType.NICK:
@ -1106,15 +1106,15 @@ export default class App extends Component {
return; return;
} }
var netID = getActiveNetworkID(this.state); var serverID = getActiveServerID(this.state);
var client = this.clients.get(netID); var client = this.clients.get(serverID);
var msg = { command: "PRIVMSG", params: [target, text] }; var msg = { command: "PRIVMSG", params: [target, text] };
client.send(msg); client.send(msg);
if (!client.enabledCaps["echo-message"]) { if (!client.enabledCaps["echo-message"]) {
msg.prefix = { name: client.nick }; msg.prefix = { name: client.nick };
this.addMessage(netID, target, msg); this.addMessage(serverID, target, msg);
} }
} }
@ -1183,12 +1183,12 @@ export default class App extends Component {
}); });
} }
handleJoinClick(netID) { handleJoinClick(serverID) {
this.setState({ dialog: "join", joinDialog: { network: netID } }); this.setState({ dialog: "join", joinDialog: { server: serverID } });
} }
handleJoinSubmit(data) { handleJoinSubmit(data) {
var client = this.clients.get(this.state.joinDialog.network); var client = this.clients.get(this.state.joinDialog.server);
this.switchToChannel = data.channel; this.switchToChannel = data.channel;
client.send({ command: "JOIN", params: [data.channel] }); client.send({ command: "JOIN", params: [data.channel] });
@ -1236,7 +1236,7 @@ export default class App extends Component {
return; return;
} }
var client = this.clients.get(buf.network); var client = this.clients.get(buf.server);
if (!client || !client.enabledCaps["draft/chathistory"] || !client.enabledCaps["server-time"]) { if (!client || !client.enabledCaps["draft/chathistory"] || !client.enabledCaps["server-time"]) {
return; return;
@ -1268,9 +1268,9 @@ export default class App extends Component {
this.setState({ dialog: "network", networkDialog: null }); this.setState({ dialog: "network", networkDialog: null });
} }
handleManageNetworkClick(netID) { handleManageNetworkClick(serverID) {
var network = this.state.networks.get(netID); var server = this.state.servers.get(serverID);
var bouncerNetID = network.isupport.get("BOUNCER_NETID"); var bouncerNetID = server.isupport.get("BOUNCER_NETID");
var bouncerNetwork = this.state.bouncerNetworks.get(bouncerNetID); var bouncerNetwork = this.state.bouncerNetworks.get(bouncerNetID);
this.setState({ this.setState({
dialog: "network", dialog: "network",
@ -1316,8 +1316,8 @@ export default class App extends Component {
this.setState({ dialog: null, networkDialog: null }); this.setState({ dialog: null, networkDialog: null });
} }
handleMode(netID, msg) { handleMode(serverID, msg) {
var client = this.clients.get(netID); var client = this.clients.get(serverID);
var chanmodes = client.isupport.get("CHANMODES") || irc.STD_CHANMODES; var chanmodes = client.isupport.get("CHANMODES") || irc.STD_CHANMODES;
var prefix = client.isupport.get("PREFIX") || ""; var prefix = client.isupport.get("PREFIX") || "";
@ -1363,7 +1363,7 @@ export default class App extends Component {
} }
if (prefixByMode.has(mode)) { if (prefixByMode.has(mode)) {
this.handlePrefixChange(netID, channel, arg, prefixByMode.get(mode), add); this.handlePrefixChange(serverID, channel, arg, prefixByMode.get(mode), add);
} }
// XXX: If we eventually want to handle any mode changes with // XXX: If we eventually want to handle any mode changes with
@ -1372,15 +1372,15 @@ export default class App extends Component {
} }
} }
handlePrefixChange(netID, channel, nick, letter, add) { handlePrefixChange(serverID, channel, nick, letter, add) {
var client = this.clients.get(netID); var client = this.clients.get(serverID);
var prefix = client.isupport.get("PREFIX") || ""; var prefix = client.isupport.get("PREFIX") || "";
var prefixPrivs = new Map(irc.parseMemberships(prefix).map((membership, i) => { var prefixPrivs = new Map(irc.parseMemberships(prefix).map((membership, i) => {
return [membership.prefix, i]; return [membership.prefix, i];
})); }));
this.setBufferState({ network: netID, name: channel }, (buf) => { this.setBufferState({ server: serverID, name: channel }, (buf) => {
var members = new irc.CaseMapMap(buf.members); var members = new irc.CaseMapMap(buf.members);
var membership = members.get(nick); var membership = members.get(nick);
if (add) { if (add) {
@ -1404,29 +1404,29 @@ export default class App extends Component {
} }
render() { render() {
var activeBuffer = null, activeNetwork = null, activeBouncerNetwork = null; var activeBuffer = null, activeServer = null, activeBouncerNetwork = null;
var isBouncer = false; var isBouncer = false;
if (this.state.buffers.get(this.state.activeBuffer)) { if (this.state.buffers.get(this.state.activeBuffer)) {
activeBuffer = this.state.buffers.get(this.state.activeBuffer); activeBuffer = this.state.buffers.get(this.state.activeBuffer);
activeNetwork = this.state.networks.get(activeBuffer.network); activeServer = this.state.servers.get(activeBuffer.server);
var activeClient = this.clients.get(activeBuffer.network); var activeClient = this.clients.get(activeBuffer.server);
isBouncer = activeClient && activeClient.enabledCaps["soju.im/bouncer-networks"]; isBouncer = activeClient && activeClient.enabledCaps["soju.im/bouncer-networks"];
var bouncerNetID = activeNetwork.isupport.get("BOUNCER_NETID"); var bouncerNetID = activeServer.isupport.get("BOUNCER_NETID");
if (bouncerNetID) { if (bouncerNetID) {
activeBouncerNetwork = this.state.bouncerNetworks.get(bouncerNetID); activeBouncerNetwork = this.state.bouncerNetworks.get(bouncerNetID);
} }
} }
if (!activeNetwork || (activeNetwork.status !== NetworkStatus.REGISTERED && !activeBuffer)) { if (!activeServer || (activeServer.status !== ServerStatus.REGISTERED && !activeBuffer)) {
// TODO: using key=connectParams trashes the ConnectForm state on update // TODO: using key=connectParams trashes the ConnectForm state on update
return html` return html`
<section id="connect"> <section id="connect">
<${ConnectForm} <${ConnectForm}
error=${this.state.error} error=${this.state.error}
params=${this.state.connectParams} params=${this.state.connectParams}
disabled=${activeNetwork} disabled=${activeServer}
onSubmit=${this.handleConnectSubmit} onSubmit=${this.handleConnectSubmit}
key=${this.state.connectParams} key=${this.state.connectParams}
/> />
@ -1440,14 +1440,14 @@ export default class App extends Component {
<section id="buffer-header"> <section id="buffer-header">
<${BufferHeader} <${BufferHeader}
buffer=${activeBuffer} buffer=${activeBuffer}
network=${activeNetwork} server=${activeServer}
isBouncer=${isBouncer} isBouncer=${isBouncer}
bouncerNetwork=${activeBouncerNetwork} bouncerNetwork=${activeBouncerNetwork}
onChannelClick=${this.handleChannelClick} onChannelClick=${this.handleChannelClick}
onClose=${() => this.close(activeBuffer)} onClose=${() => this.close(activeBuffer)}
onJoin=${() => this.handleJoinClick(activeBuffer.network)} onJoin=${() => this.handleJoinClick(activeBuffer.server)}
onAddNetwork=${this.handleAddNetworkClick} onAddNetwork=${this.handleAddNetworkClick}
onManageNetwork=${() => this.handleManageNetworkClick(activeBuffer.network)} onManageNetwork=${() => this.handleManageNetworkClick(activeBuffer.server)}
/> />
</section> </section>
`; `;
@ -1525,7 +1525,7 @@ export default class App extends Component {
if (activeBuffer && activeBuffer.type === BufferType.SERVER) { if (activeBuffer && activeBuffer.type === BufferType.SERVER) {
composerReadOnly = true; composerReadOnly = true;
} }
if (activeNetwork && activeNetwork.status !== NetworkStatus.REGISTERED) { if (activeServer && activeServer.status !== ServerStatus.REGISTERED) {
composerReadOnly = true; composerReadOnly = true;
} }
@ -1536,7 +1536,7 @@ export default class App extends Component {
> >
<${BufferList} <${BufferList}
buffers=${this.state.buffers} buffers=${this.state.buffers}
networks=${this.state.networks} servers=${this.state.servers}
bouncerNetworks=${this.state.bouncerNetworks} bouncerNetworks=${this.state.bouncerNetworks}
isBouncer=${isBouncer} isBouncer=${isBouncer}
activeBuffer=${this.state.activeBuffer} activeBuffer=${this.state.activeBuffer}

View File

@ -1,7 +1,7 @@
import { html, Component } from "../lib/index.js"; import { html, Component } from "../lib/index.js";
import linkify from "../lib/linkify.js"; import linkify from "../lib/linkify.js";
import { strip as stripANSI } from "../lib/ansi.js"; import { strip as stripANSI } from "../lib/ansi.js";
import { BufferType, NetworkStatus, getNetworkName } from "../state.js"; import { BufferType, ServerStatus, getServerName } from "../state.js";
const UserStatus = { const UserStatus = {
HERE: "here", HERE: "here",
@ -40,17 +40,17 @@ export default function BufferHeader(props) {
var description = null, actions = null; var description = null, actions = null;
switch (props.buffer.type) { switch (props.buffer.type) {
case BufferType.SERVER: case BufferType.SERVER:
switch (props.network.status) { switch (props.server.status) {
case NetworkStatus.DISCONNECTED: case ServerStatus.DISCONNECTED:
description = "Disconnected"; description = "Disconnected";
break; break;
case NetworkStatus.CONNECTING: case ServerStatus.CONNECTING:
description = "Connecting..."; description = "Connecting...";
break; break;
case NetworkStatus.REGISTERING: case ServerStatus.REGISTERING:
description = "Logging in..."; description = "Logging in...";
break; break;
case NetworkStatus.REGISTERED: case ServerStatus.REGISTERED:
if (props.bouncerNetwork) { if (props.bouncerNetwork) {
switch (props.bouncerNetwork.state) { switch (props.bouncerNetwork.state) {
case "disconnected": case "disconnected":
@ -74,7 +74,7 @@ export default function BufferHeader(props) {
} }
if (props.isBouncer) { if (props.isBouncer) {
if (props.network.isupport.get("BOUNCER_NETID")) { if (props.server.isupport.get("BOUNCER_NETID")) {
actions = html` actions = html`
<button <button
key="join" key="join"
@ -156,7 +156,7 @@ export default function BufferHeader(props) {
var name = props.buffer.name; var name = props.buffer.name;
if (props.buffer.type == BufferType.SERVER) { if (props.buffer.type == BufferType.SERVER) {
name = getNetworkName(props.network, props.bouncerNetwork, props.isBouncer); name = getServerName(server, props.bouncerNetwork, props.isBouncer);
} }
return html` return html`

View File

@ -1,6 +1,6 @@
import * as irc from "../lib/irc.js"; import * as irc from "../lib/irc.js";
import { html, Component } from "../lib/index.js"; import { html, Component } from "../lib/index.js";
import { BufferType, Unread, getBufferURL, getNetworkName } from "../state.js"; import { BufferType, Unread, getBufferURL, getServerName } from "../state.js";
function BufferItem(props) { function BufferItem(props) {
function handleClick(event) { function handleClick(event) {
@ -10,7 +10,7 @@ function BufferItem(props) {
var name = props.buffer.name; var name = props.buffer.name;
if (props.buffer.type == BufferType.SERVER) { if (props.buffer.type == BufferType.SERVER) {
name = getNetworkName(props.network, props.bouncerNetwork, props.isBouncer); name = getServerName(props.server, props.bouncerNetwork, props.isBouncer);
} }
var classes = ["type-" + props.buffer.type]; var classes = ["type-" + props.buffer.type];
@ -31,10 +31,10 @@ function BufferItem(props) {
export default function BufferList(props) { export default function BufferList(props) {
var items = Array.from(props.buffers.values()).map((buf) => { var items = Array.from(props.buffers.values()).map((buf) => {
var network = props.networks.get(buf.network); var server = props.servers.get(buf.server);
var bouncerNetwork = null; var bouncerNetwork = null;
var bouncerNetID = network.isupport.get("BOUNCER_NETID"); var bouncerNetID = server.isupport.get("BOUNCER_NETID");
if (bouncerNetID) { if (bouncerNetID) {
bouncerNetwork = props.bouncerNetworks.get(bouncerNetID); bouncerNetwork = props.bouncerNetworks.get(bouncerNetID);
} }
@ -43,7 +43,7 @@ export default function BufferList(props) {
<${BufferItem} <${BufferItem}
key=${buf.id} key=${buf.id}
buffer=${buf} buffer=${buf}
network=${network} server=${server}
isBouncer=${props.isBouncer} isBouncer=${props.isBouncer}
bouncerNetwork=${bouncerNetwork} bouncerNetwork=${bouncerNetwork}
onClick=${() => props.onBufferClick(buf)} onClick=${() => props.onBufferClick(buf)}

View File

@ -8,7 +8,7 @@ export const BufferType = {
NICK: "nick", NICK: "nick",
}; };
export const NetworkStatus = Client.Status; export const ServerStatus = Client.Status;
export const Unread = { export const Unread = {
NONE: "", NONE: "",
@ -62,7 +62,7 @@ export function getMessageURL(buf, msg) {
} }
} }
export function getNetworkName(network, bouncerNetwork, isBouncer) { export function getServerName(server, bouncerNetwork, isBouncer) {
if (bouncerNetwork && bouncerNetwork.name) { if (bouncerNetwork && bouncerNetwork.name) {
return bouncerNetwork.name; return bouncerNetwork.name;
} }
@ -70,7 +70,7 @@ export function getNetworkName(network, bouncerNetwork, isBouncer) {
return "bouncer"; return "bouncer";
} }
var netName = network.isupport.get("NETWORK"); var netName = server.isupport.get("NETWORK");
if (netName) { if (netName) {
return netName; return netName;
} }