gamja/state.js

165 lines
3.3 KiB
JavaScript
Raw Normal View History

2021-06-04 12:03:03 -04:00
import * as irc from "./lib/irc.js";
import Client from "./lib/client.js";
2021-01-22 12:29:22 -05:00
2020-07-13 11:22:24 -04:00
export const SERVER_BUFFER = "*";
2020-06-26 04:35:38 -04:00
export const BufferType = {
SERVER: "server",
CHANNEL: "channel",
NICK: "nick",
};
2020-06-24 10:56:28 -04:00
export const ServerStatus = Client.Status;
2020-06-24 10:56:28 -04:00
export const Unread = {
NONE: "",
MESSAGE: "message",
2020-06-29 05:08:47 -04:00
HIGHLIGHT: "highlight",
2020-06-24 10:56:28 -04:00
2021-05-31 12:26:04 -04:00
compare(a, b) {
2020-06-24 10:56:28 -04:00
const priority = {
2021-05-27 16:35:41 -04:00
[Unread.NONE]: 0,
2020-06-24 10:56:28 -04:00
[Unread.MESSAGE]: 1,
2020-06-29 05:08:47 -04:00
[Unread.HIGHLIGHT]: 2,
2020-06-24 10:56:28 -04:00
};
2021-05-31 12:26:04 -04:00
return priority[a] - priority[b];
},
union(a, b) {
return (Unread.compare(a, b) > 0) ? a : b;
2020-06-24 10:56:28 -04:00
},
};
2020-07-15 12:47:33 -04:00
2020-07-23 03:58:05 -04:00
export const ReceiptType = {
DELIVERED: "delivered",
READ: "read",
};
2020-07-15 12:47:33 -04:00
export function getNickURL(nick) {
return "irc:///" + encodeURIComponent(nick) + ",isuser";
2020-07-15 12:47:33 -04:00
}
export function getChannelURL(channel) {
return "irc:///" + encodeURIComponent(channel);
}
2020-07-15 12:47:33 -04:00
export function getBufferURL(buf) {
switch (buf.type) {
case BufferType.SERVER:
return "irc:///";
case BufferType.CHANNEL:
return getChannelURL(buf.name);
2020-07-15 12:47:33 -04:00
case BufferType.NICK:
return getNickURL(buf.name);
}
throw new Error("Unknown buffer type: " + buf.type);
}
export function getMessageURL(buf, msg) {
var bufURL = getBufferURL(buf);
2020-07-21 08:48:04 -04:00
if (msg.tags.msgid) {
return bufURL + "?msgid=" + encodeURIComponent(msg.tags.msgid);
2020-07-21 08:48:04 -04:00
} else {
return bufURL + "?timestamp=" + encodeURIComponent(msg.tags.time);
2020-07-21 08:48:04 -04:00
}
2020-07-15 12:47:33 -04:00
}
export function getServerName(server, bouncerNetwork, isBouncer) {
if (bouncerNetwork && bouncerNetwork.name) {
return bouncerNetwork.name;
}
if (isBouncer) {
return "bouncer";
}
var netName = server.isupport.get("NETWORK");
if (netName) {
return netName;
}
return "server";
}
2021-06-04 12:03:03 -04:00
function updateState(state, updater) {
var updated;
if (typeof updater === "function") {
updated = updater(state, state);
} else {
updated = updater;
}
if (state === updated || !updated) {
return;
}
return { ...state, ...updated };
}
export const State = {
updateServer(state, id, updater) {
var server = state.servers.get(id);
if (!server) {
return;
}
var updated = updateState(server, updater);
if (!updated) {
return;
}
var servers = new Map(state.servers);
servers.set(id, updated);
return { servers };
},
updateBuffer(state, id, updater) {
var buf = State.getBuffer(state, id);
if (!buf) {
return;
}
var updated = updateState(buf, updater);
if (!updated) {
return;
}
var buffers = new Map(state.buffers);
buffers.set(buf.id, updated);
return { buffers };
},
getActiveServerID(state) {
var buf = state.buffers.get(state.activeBuffer);
if (!buf) {
return null;
}
return buf.server;
},
getBuffer(state, id) {
switch (typeof id) {
case "number":
return state.buffers.get(id);
case "object":
if (id.id) {
return state.buffers.get(id.id);
}
var serverID = id.server, name = id.name;
if (!serverID) {
serverID = State.getActiveServerID(state);
}
var cm = irc.CaseMapping.RFC1459;
var server = state.servers.get(serverID);
if (server) {
cm = irc.CaseMapping.byName(server.isupport.get("CASEMAPPING")) || cm;
}
var nameCM = cm(name);
for (var buf of state.buffers.values()) {
if (buf.server === serverID && cm(buf.name) === nameCM) {
return buf;
}
}
return null;
default:
throw new Error("Invalid buffer ID type: " + (typeof id));
}
},
};