@lordbex/thelounge 4.4.3-blowfish
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.thelounge_home +1 -0
- package/LICENSE +22 -0
- package/README.md +95 -0
- package/client/index.html.tpl +69 -0
- package/dist/defaults/config.js +465 -0
- package/dist/package.json +174 -0
- package/dist/server/client.js +678 -0
- package/dist/server/clientManager.js +220 -0
- package/dist/server/command-line/index.js +85 -0
- package/dist/server/command-line/install.js +123 -0
- package/dist/server/command-line/outdated.js +30 -0
- package/dist/server/command-line/start.js +34 -0
- package/dist/server/command-line/storage.js +103 -0
- package/dist/server/command-line/uninstall.js +40 -0
- package/dist/server/command-line/upgrade.js +64 -0
- package/dist/server/command-line/users/add.js +67 -0
- package/dist/server/command-line/users/edit.js +39 -0
- package/dist/server/command-line/users/index.js +17 -0
- package/dist/server/command-line/users/list.js +53 -0
- package/dist/server/command-line/users/remove.js +37 -0
- package/dist/server/command-line/users/reset.js +64 -0
- package/dist/server/command-line/utils.js +177 -0
- package/dist/server/config.js +138 -0
- package/dist/server/helper.js +161 -0
- package/dist/server/identification.js +139 -0
- package/dist/server/index.js +3 -0
- package/dist/server/log.js +35 -0
- package/dist/server/models/chan.js +275 -0
- package/dist/server/models/msg.js +92 -0
- package/dist/server/models/network.js +546 -0
- package/dist/server/models/prefix.js +31 -0
- package/dist/server/models/user.js +42 -0
- package/dist/server/plugins/auth/ldap.js +188 -0
- package/dist/server/plugins/auth/local.js +41 -0
- package/dist/server/plugins/auth.js +70 -0
- package/dist/server/plugins/changelog.js +103 -0
- package/dist/server/plugins/clientCertificate.js +115 -0
- package/dist/server/plugins/dev-server.js +33 -0
- package/dist/server/plugins/inputs/action.js +54 -0
- package/dist/server/plugins/inputs/away.js +20 -0
- package/dist/server/plugins/inputs/ban.js +45 -0
- package/dist/server/plugins/inputs/blow.js +44 -0
- package/dist/server/plugins/inputs/connect.js +41 -0
- package/dist/server/plugins/inputs/ctcp.js +29 -0
- package/dist/server/plugins/inputs/disconnect.js +15 -0
- package/dist/server/plugins/inputs/ignore.js +74 -0
- package/dist/server/plugins/inputs/ignorelist.js +50 -0
- package/dist/server/plugins/inputs/index.js +105 -0
- package/dist/server/plugins/inputs/invite.js +31 -0
- package/dist/server/plugins/inputs/kick.js +26 -0
- package/dist/server/plugins/inputs/kill.js +13 -0
- package/dist/server/plugins/inputs/list.js +12 -0
- package/dist/server/plugins/inputs/mode.js +55 -0
- package/dist/server/plugins/inputs/msg.js +106 -0
- package/dist/server/plugins/inputs/mute.js +56 -0
- package/dist/server/plugins/inputs/nick.js +55 -0
- package/dist/server/plugins/inputs/notice.js +42 -0
- package/dist/server/plugins/inputs/part.js +46 -0
- package/dist/server/plugins/inputs/quit.js +27 -0
- package/dist/server/plugins/inputs/raw.js +13 -0
- package/dist/server/plugins/inputs/rejoin.js +25 -0
- package/dist/server/plugins/inputs/topic.js +24 -0
- package/dist/server/plugins/inputs/whois.js +19 -0
- package/dist/server/plugins/irc-events/away.js +59 -0
- package/dist/server/plugins/irc-events/cap.js +62 -0
- package/dist/server/plugins/irc-events/chghost.js +29 -0
- package/dist/server/plugins/irc-events/connection.js +152 -0
- package/dist/server/plugins/irc-events/ctcp.js +72 -0
- package/dist/server/plugins/irc-events/error.js +80 -0
- package/dist/server/plugins/irc-events/help.js +21 -0
- package/dist/server/plugins/irc-events/info.js +21 -0
- package/dist/server/plugins/irc-events/invite.js +27 -0
- package/dist/server/plugins/irc-events/join.js +53 -0
- package/dist/server/plugins/irc-events/kick.js +39 -0
- package/dist/server/plugins/irc-events/link.js +442 -0
- package/dist/server/plugins/irc-events/list.js +47 -0
- package/dist/server/plugins/irc-events/message.js +187 -0
- package/dist/server/plugins/irc-events/mode.js +124 -0
- package/dist/server/plugins/irc-events/modelist.js +67 -0
- package/dist/server/plugins/irc-events/motd.js +29 -0
- package/dist/server/plugins/irc-events/names.js +21 -0
- package/dist/server/plugins/irc-events/nick.js +45 -0
- package/dist/server/plugins/irc-events/part.js +35 -0
- package/dist/server/plugins/irc-events/quit.js +32 -0
- package/dist/server/plugins/irc-events/sasl.js +26 -0
- package/dist/server/plugins/irc-events/topic.js +42 -0
- package/dist/server/plugins/irc-events/unhandled.js +31 -0
- package/dist/server/plugins/irc-events/welcome.js +22 -0
- package/dist/server/plugins/irc-events/whois.js +57 -0
- package/dist/server/plugins/messageStorage/sqlite.js +454 -0
- package/dist/server/plugins/messageStorage/text.js +124 -0
- package/dist/server/plugins/packages/index.js +200 -0
- package/dist/server/plugins/packages/publicClient.js +66 -0
- package/dist/server/plugins/packages/themes.js +61 -0
- package/dist/server/plugins/storage.js +88 -0
- package/dist/server/plugins/sts.js +85 -0
- package/dist/server/plugins/uploader.js +267 -0
- package/dist/server/plugins/webpush.js +99 -0
- package/dist/server/server.js +857 -0
- package/dist/server/storageCleaner.js +131 -0
- package/dist/server/utils/fish.js +432 -0
- package/dist/shared/irc.js +19 -0
- package/dist/shared/linkify.js +81 -0
- package/dist/shared/types/chan.js +22 -0
- package/dist/shared/types/changelog.js +2 -0
- package/dist/shared/types/config.js +2 -0
- package/dist/shared/types/mention.js +2 -0
- package/dist/shared/types/msg.js +34 -0
- package/dist/shared/types/network.js +2 -0
- package/dist/shared/types/storage.js +2 -0
- package/dist/shared/types/user.js +2 -0
- package/dist/webpack.config.js +224 -0
- package/index.js +38 -0
- package/package.json +174 -0
- package/public/audio/pop.wav +0 -0
- package/public/css/style.css +12 -0
- package/public/css/style.css.map +1 -0
- package/public/favicon.ico +0 -0
- package/public/fonts/fa-solid-900.woff +0 -0
- package/public/fonts/fa-solid-900.woff2 +0 -0
- package/public/img/favicon-alerted.ico +0 -0
- package/public/img/icon-alerted-black-transparent-bg-72x72px.png +0 -0
- package/public/img/icon-alerted-grey-bg-192x192px.png +0 -0
- package/public/img/icon-black-transparent-bg.svg +1 -0
- package/public/img/logo-grey-bg-120x120px.png +0 -0
- package/public/img/logo-grey-bg-152x152px.png +0 -0
- package/public/img/logo-grey-bg-167x167px.png +0 -0
- package/public/img/logo-grey-bg-180x180px.png +0 -0
- package/public/img/logo-grey-bg-192x192px.png +0 -0
- package/public/img/logo-grey-bg-512x512px.png +0 -0
- package/public/img/logo-grey-bg.svg +1 -0
- package/public/img/logo-horizontal-transparent-bg-inverted.svg +1 -0
- package/public/img/logo-horizontal-transparent-bg.svg +1 -0
- package/public/img/logo-transparent-bg-inverted.svg +1 -0
- package/public/img/logo-transparent-bg.svg +1 -0
- package/public/img/logo-vertical-transparent-bg-inverted.svg +1 -0
- package/public/img/logo-vertical-transparent-bg.svg +1 -0
- package/public/js/bundle.js +2 -0
- package/public/js/bundle.js.map +1 -0
- package/public/js/bundle.vendor.js +3 -0
- package/public/js/bundle.vendor.js.LICENSE.txt +18 -0
- package/public/js/bundle.vendor.js.map +1 -0
- package/public/js/loading-error-handlers.js +1 -0
- package/public/robots.txt +2 -0
- package/public/service-worker.js +1 -0
- package/public/thelounge.webmanifest +53 -0
- package/public/themes/default.css +35 -0
- package/public/themes/morning.css +183 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const msg_1 = __importDefault(require("../../models/msg"));
|
|
7
|
+
const msg_2 = require("../../../shared/types/msg");
|
|
8
|
+
const chan_1 = require("../../../shared/types/chan");
|
|
9
|
+
const commands = ["ban", "unban", "banlist", "kickban"];
|
|
10
|
+
const input = function ({ irc }, chan, cmd, args) {
|
|
11
|
+
if (chan.type !== chan_1.ChanType.CHANNEL) {
|
|
12
|
+
chan.pushMessage(this, new msg_1.default({
|
|
13
|
+
type: msg_2.MessageType.ERROR,
|
|
14
|
+
text: `${cmd} command can only be used in channels.`,
|
|
15
|
+
}));
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (cmd !== "banlist" && args.length === 0) {
|
|
19
|
+
if (args.length === 0) {
|
|
20
|
+
chan.pushMessage(this, new msg_1.default({
|
|
21
|
+
type: msg_2.MessageType.ERROR,
|
|
22
|
+
text: `Usage: /${cmd} <nick>`,
|
|
23
|
+
}));
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
switch (cmd) {
|
|
28
|
+
case "kickban":
|
|
29
|
+
irc.raw("KICK", chan.name, args[0], args.slice(1).join(" "));
|
|
30
|
+
// fall through
|
|
31
|
+
case "ban":
|
|
32
|
+
irc.ban(chan.name, args[0]);
|
|
33
|
+
break;
|
|
34
|
+
case "unban":
|
|
35
|
+
irc.unban(chan.name, args[0]);
|
|
36
|
+
break;
|
|
37
|
+
case "banlist":
|
|
38
|
+
irc.banlist(chan.name);
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
exports.default = {
|
|
43
|
+
commands,
|
|
44
|
+
input,
|
|
45
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const msg_1 = __importDefault(require("../../models/msg"));
|
|
7
|
+
const msg_2 = require("../../../shared/types/msg");
|
|
8
|
+
const commands = ["blow"];
|
|
9
|
+
const input = function (network, chan, _cmd, args) {
|
|
10
|
+
if (!chan) {
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
if (args.length === 0) {
|
|
14
|
+
chan.pushMessage(this, new msg_1.default({
|
|
15
|
+
type: msg_2.MessageType.NOTICE,
|
|
16
|
+
text: chan.blowfishKey
|
|
17
|
+
? `FiSH: Key is set for ${chan.name}. Use /blow off to clear.`
|
|
18
|
+
: `FiSH: No key set for ${chan.name}. Use /blow <key> to set.`,
|
|
19
|
+
}));
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
const sub = args.join(" ").trim();
|
|
23
|
+
if (!sub) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
if (sub.toLowerCase() === "off" || sub.toLowerCase() === "clear") {
|
|
27
|
+
chan.blowfishKey = undefined;
|
|
28
|
+
chan.pushMessage(this, new msg_1.default({
|
|
29
|
+
type: msg_2.MessageType.NOTICE,
|
|
30
|
+
text: `FiSH: Key cleared for ${chan.name}.`,
|
|
31
|
+
}));
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
chan.blowfishKey = sub;
|
|
35
|
+
chan.pushMessage(this, new msg_1.default({
|
|
36
|
+
type: msg_2.MessageType.NOTICE,
|
|
37
|
+
text: `FiSH: Key set for ${chan.name}.`,
|
|
38
|
+
}));
|
|
39
|
+
return true;
|
|
40
|
+
};
|
|
41
|
+
exports.default = {
|
|
42
|
+
commands,
|
|
43
|
+
input,
|
|
44
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const msg_1 = __importDefault(require("../../models/msg"));
|
|
7
|
+
const msg_2 = require("../../../shared/types/msg");
|
|
8
|
+
const commands = ["connect", "server"];
|
|
9
|
+
const allowDisconnected = true;
|
|
10
|
+
const input = function (network, chan, cmd, args) {
|
|
11
|
+
if (args.length === 0) {
|
|
12
|
+
network.userDisconnected = false;
|
|
13
|
+
this.save();
|
|
14
|
+
const irc = network.irc;
|
|
15
|
+
if (!irc) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (irc.connected) {
|
|
19
|
+
chan.pushMessage(this, new msg_1.default({
|
|
20
|
+
type: msg_2.MessageType.ERROR,
|
|
21
|
+
text: "You are already connected.",
|
|
22
|
+
}));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
irc.connect();
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
let port = args[1] || "";
|
|
29
|
+
const tls = port[0] === "+";
|
|
30
|
+
if (tls) {
|
|
31
|
+
port = port.substring(1);
|
|
32
|
+
}
|
|
33
|
+
const host = args[0];
|
|
34
|
+
this.connectToNetwork({ host, port, tls });
|
|
35
|
+
return true;
|
|
36
|
+
};
|
|
37
|
+
exports.default = {
|
|
38
|
+
commands,
|
|
39
|
+
input,
|
|
40
|
+
allowDisconnected,
|
|
41
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const msg_1 = __importDefault(require("../../models/msg"));
|
|
7
|
+
const msg_2 = require("../../../shared/types/msg");
|
|
8
|
+
const commands = ["ctcp"];
|
|
9
|
+
const input = function ({ irc }, chan, cmd, args) {
|
|
10
|
+
if (args.length < 2) {
|
|
11
|
+
chan.pushMessage(this, new msg_1.default({
|
|
12
|
+
type: msg_2.MessageType.ERROR,
|
|
13
|
+
text: "Usage: /ctcp <nick> <ctcp_type>",
|
|
14
|
+
}));
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const target = args.shift();
|
|
18
|
+
const type = args.shift();
|
|
19
|
+
chan.pushMessage(this, new msg_1.default({
|
|
20
|
+
type: msg_2.MessageType.CTCP_REQUEST,
|
|
21
|
+
ctcpMessage: `"${type}" to ${target}`,
|
|
22
|
+
from: chan.getUser(irc.user.nick),
|
|
23
|
+
}));
|
|
24
|
+
irc.ctcpRequest(target, type, ...args);
|
|
25
|
+
};
|
|
26
|
+
exports.default = {
|
|
27
|
+
commands,
|
|
28
|
+
input,
|
|
29
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const commands = ["disconnect"];
|
|
4
|
+
const allowDisconnected = true;
|
|
5
|
+
const input = function (network, chan, cmd, args) {
|
|
6
|
+
const quitMessage = args[0] ? args.join(" ") : undefined;
|
|
7
|
+
network.quit(quitMessage);
|
|
8
|
+
network.userDisconnected = true;
|
|
9
|
+
this.save();
|
|
10
|
+
};
|
|
11
|
+
exports.default = {
|
|
12
|
+
commands,
|
|
13
|
+
input,
|
|
14
|
+
allowDisconnected,
|
|
15
|
+
};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const msg_1 = __importDefault(require("../../models/msg"));
|
|
7
|
+
const helper_1 = __importDefault(require("../../helper"));
|
|
8
|
+
const msg_2 = require("../../../shared/types/msg");
|
|
9
|
+
const commands = ["ignore", "unignore"];
|
|
10
|
+
const input = function (network, chan, cmd, args) {
|
|
11
|
+
const client = this;
|
|
12
|
+
if (args.length === 0 || args[0].trim().length === 0) {
|
|
13
|
+
chan.pushMessage(client, new msg_1.default({
|
|
14
|
+
type: msg_2.MessageType.ERROR,
|
|
15
|
+
text: `Usage: /${cmd} <nick>[!ident][@host]`,
|
|
16
|
+
}));
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const target = args[0].trim();
|
|
20
|
+
const hostmask = helper_1.default.parseHostmask(target);
|
|
21
|
+
switch (cmd) {
|
|
22
|
+
case "ignore": {
|
|
23
|
+
// IRC nicks are case insensitive
|
|
24
|
+
if (hostmask.nick.toLowerCase() === network.nick.toLowerCase()) {
|
|
25
|
+
chan.pushMessage(client, new msg_1.default({
|
|
26
|
+
type: msg_2.MessageType.ERROR,
|
|
27
|
+
text: "You can't ignore yourself",
|
|
28
|
+
}));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (network.ignoreList.some(function (entry) {
|
|
32
|
+
return helper_1.default.compareHostmask(entry, hostmask);
|
|
33
|
+
})) {
|
|
34
|
+
chan.pushMessage(client, new msg_1.default({
|
|
35
|
+
type: msg_2.MessageType.ERROR,
|
|
36
|
+
text: "The specified user/hostmask is already ignored",
|
|
37
|
+
}));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
network.ignoreList.push({
|
|
41
|
+
...hostmask,
|
|
42
|
+
when: Date.now(),
|
|
43
|
+
});
|
|
44
|
+
client.save();
|
|
45
|
+
chan.pushMessage(client, new msg_1.default({
|
|
46
|
+
type: msg_2.MessageType.ERROR, // TODO: Successfully added via type.Error 🤔 ?
|
|
47
|
+
text: `\u0002${hostmask.nick}!${hostmask.ident}@${hostmask.hostname}\u000f added to ignorelist`,
|
|
48
|
+
}));
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
case "unignore": {
|
|
52
|
+
const idx = network.ignoreList.findIndex(function (entry) {
|
|
53
|
+
return helper_1.default.compareHostmask(entry, hostmask);
|
|
54
|
+
});
|
|
55
|
+
if (idx === -1) {
|
|
56
|
+
chan.pushMessage(client, new msg_1.default({
|
|
57
|
+
type: msg_2.MessageType.ERROR,
|
|
58
|
+
text: "The specified user/hostmask is not ignored",
|
|
59
|
+
}));
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
network.ignoreList.splice(idx, 1);
|
|
63
|
+
client.save();
|
|
64
|
+
chan.pushMessage(client, new msg_1.default({
|
|
65
|
+
type: msg_2.MessageType.ERROR, // TODO: Successfully removed via type.Error 🤔 ?
|
|
66
|
+
text: `Successfully removed \u0002${hostmask.nick}!${hostmask.ident}@${hostmask.hostname}\u000f from ignorelist`,
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
exports.default = {
|
|
72
|
+
commands,
|
|
73
|
+
input,
|
|
74
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const msg_1 = __importDefault(require("../../models/msg"));
|
|
7
|
+
const chan_1 = require("../../../shared/types/chan");
|
|
8
|
+
const msg_2 = require("../../../shared/types/msg");
|
|
9
|
+
const commands = ["ignorelist"];
|
|
10
|
+
const input = function (network, chan, _cmd, _args) {
|
|
11
|
+
const client = this;
|
|
12
|
+
if (network.ignoreList.length === 0) {
|
|
13
|
+
chan.pushMessage(client, new msg_1.default({
|
|
14
|
+
type: msg_2.MessageType.ERROR,
|
|
15
|
+
text: "Ignorelist is empty",
|
|
16
|
+
}));
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const chanName = "Ignored users";
|
|
20
|
+
const ignored = network.ignoreList.map((data) => ({
|
|
21
|
+
hostmask: `${data.nick}!${data.ident}@${data.hostname}`,
|
|
22
|
+
when: data.when,
|
|
23
|
+
}));
|
|
24
|
+
let newChan = network.getChannel(chanName);
|
|
25
|
+
if (typeof newChan === "undefined") {
|
|
26
|
+
newChan = client.createChannel({
|
|
27
|
+
type: chan_1.ChanType.SPECIAL,
|
|
28
|
+
special: chan_1.SpecialChanType.IGNORELIST,
|
|
29
|
+
name: chanName,
|
|
30
|
+
data: ignored,
|
|
31
|
+
});
|
|
32
|
+
client.emit("join", {
|
|
33
|
+
network: network.uuid,
|
|
34
|
+
chan: newChan.getFilteredClone(true),
|
|
35
|
+
shouldOpen: false,
|
|
36
|
+
index: network.addChannel(newChan),
|
|
37
|
+
});
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
// TODO: add type for this chan/event
|
|
41
|
+
newChan.data = ignored;
|
|
42
|
+
client.emit("msg:special", {
|
|
43
|
+
chan: newChan.id,
|
|
44
|
+
data: ignored,
|
|
45
|
+
});
|
|
46
|
+
};
|
|
47
|
+
exports.default = {
|
|
48
|
+
commands,
|
|
49
|
+
input,
|
|
50
|
+
};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
const log_1 = __importDefault(require("../../log"));
|
|
30
|
+
const clientSideCommands = ["/collapse", "/expand", "/search"];
|
|
31
|
+
const passThroughCommands = [
|
|
32
|
+
"/as",
|
|
33
|
+
"/bs",
|
|
34
|
+
"/cs",
|
|
35
|
+
"/ho",
|
|
36
|
+
"/hs",
|
|
37
|
+
"/join",
|
|
38
|
+
"/ms",
|
|
39
|
+
"/ns",
|
|
40
|
+
"/os",
|
|
41
|
+
"/rs",
|
|
42
|
+
];
|
|
43
|
+
const userInputs = new Map();
|
|
44
|
+
const builtInInputs = [
|
|
45
|
+
"action",
|
|
46
|
+
"away",
|
|
47
|
+
"ban",
|
|
48
|
+
"connect",
|
|
49
|
+
"ctcp",
|
|
50
|
+
"disconnect",
|
|
51
|
+
"ignore",
|
|
52
|
+
"ignorelist",
|
|
53
|
+
"invite",
|
|
54
|
+
"kick",
|
|
55
|
+
"kill",
|
|
56
|
+
"list",
|
|
57
|
+
"mode",
|
|
58
|
+
"msg",
|
|
59
|
+
"nick",
|
|
60
|
+
"notice",
|
|
61
|
+
"part",
|
|
62
|
+
"quit",
|
|
63
|
+
"raw",
|
|
64
|
+
"rejoin",
|
|
65
|
+
"topic",
|
|
66
|
+
"whois",
|
|
67
|
+
"mute",
|
|
68
|
+
"blow",
|
|
69
|
+
];
|
|
70
|
+
for (const input of builtInInputs) {
|
|
71
|
+
Promise.resolve(`${`./${input}`}`).then(s => __importStar(require(s))).then((plugin) => {
|
|
72
|
+
plugin.default.commands.forEach((command) => userInputs.set(command, plugin.default));
|
|
73
|
+
})
|
|
74
|
+
.catch((err) => {
|
|
75
|
+
log_1.default.error(err);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
const pluginCommands = new Map();
|
|
79
|
+
const getCommands = () => Array.from(userInputs.keys())
|
|
80
|
+
.concat(Array.from(pluginCommands.keys()))
|
|
81
|
+
.map((command) => `/${command}`)
|
|
82
|
+
.concat(clientSideCommands)
|
|
83
|
+
.concat(passThroughCommands)
|
|
84
|
+
.sort();
|
|
85
|
+
const addPluginCommand = (packageInfo, command, obj) => {
|
|
86
|
+
if (typeof command !== "string") {
|
|
87
|
+
log_1.default.error(`plugin {packageInfo.packageName} tried to register a bad command`);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
else if (!obj || typeof obj.input !== "function") {
|
|
91
|
+
log_1.default.error(`plugin ${packageInfo.packageName} tried to register command "${command} without a callback"`);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
pluginCommands.set(command, {
|
|
95
|
+
packageInfo: packageInfo,
|
|
96
|
+
input: obj.input,
|
|
97
|
+
allowDisconnected: obj.allowDisconnected,
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
exports.default = {
|
|
101
|
+
addPluginCommand,
|
|
102
|
+
getCommands,
|
|
103
|
+
pluginCommands,
|
|
104
|
+
userInputs,
|
|
105
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const msg_1 = __importDefault(require("../../models/msg"));
|
|
7
|
+
const msg_2 = require("../../../shared/types/msg");
|
|
8
|
+
const chan_1 = require("../../../shared/types/chan");
|
|
9
|
+
const commands = ["invite", "invitelist"];
|
|
10
|
+
const input = function ({ irc }, chan, cmd, args) {
|
|
11
|
+
if (cmd === "invitelist") {
|
|
12
|
+
irc.inviteList(chan.name);
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
if (args.length === 2) {
|
|
16
|
+
irc.raw("INVITE", args[0], args[1]); // Channel provided in the command
|
|
17
|
+
}
|
|
18
|
+
else if (args.length === 1 && chan.type === chan_1.ChanType.CHANNEL) {
|
|
19
|
+
irc.raw("INVITE", args[0], chan.name); // Current channel
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
chan.pushMessage(this, new msg_1.default({
|
|
23
|
+
type: msg_2.MessageType.ERROR,
|
|
24
|
+
text: `${cmd} command can only be used in channels or by specifying a target.`,
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
exports.default = {
|
|
29
|
+
commands,
|
|
30
|
+
input,
|
|
31
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const msg_1 = __importDefault(require("../../models/msg"));
|
|
7
|
+
const msg_2 = require("../../../shared/types/msg");
|
|
8
|
+
const chan_1 = require("../../../shared/types/chan");
|
|
9
|
+
const commands = ["kick"];
|
|
10
|
+
const input = function ({ irc }, chan, cmd, args) {
|
|
11
|
+
if (chan.type !== chan_1.ChanType.CHANNEL) {
|
|
12
|
+
chan.pushMessage(this, new msg_1.default({
|
|
13
|
+
type: msg_2.MessageType.ERROR,
|
|
14
|
+
text: `${cmd} command can only be used in channels.`,
|
|
15
|
+
}));
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (args.length !== 0) {
|
|
19
|
+
irc.raw("KICK", chan.name, args[0], args.slice(1).join(" "));
|
|
20
|
+
}
|
|
21
|
+
return true;
|
|
22
|
+
};
|
|
23
|
+
exports.default = {
|
|
24
|
+
commands,
|
|
25
|
+
input,
|
|
26
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const commands = ["kill"];
|
|
4
|
+
const input = function ({ irc }, chan, cmd, args) {
|
|
5
|
+
if (args.length !== 0) {
|
|
6
|
+
irc.raw("KILL", args[0], args.slice(1).join(" "));
|
|
7
|
+
}
|
|
8
|
+
return true;
|
|
9
|
+
};
|
|
10
|
+
exports.default = {
|
|
11
|
+
commands,
|
|
12
|
+
input,
|
|
13
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const commands = ["list"];
|
|
4
|
+
const input = function (network, chan, cmd, args) {
|
|
5
|
+
network.chanCache = [];
|
|
6
|
+
network.irc.list(...args);
|
|
7
|
+
return true;
|
|
8
|
+
};
|
|
9
|
+
exports.default = {
|
|
10
|
+
commands,
|
|
11
|
+
input,
|
|
12
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const msg_1 = __importDefault(require("../../models/msg"));
|
|
7
|
+
const msg_2 = require("../../../shared/types/msg");
|
|
8
|
+
const chan_1 = require("../../../shared/types/chan");
|
|
9
|
+
const commands = ["mode", "umode", "op", "deop", "hop", "dehop", "voice", "devoice"];
|
|
10
|
+
const input = function ({ irc, nick }, chan, cmd, args) {
|
|
11
|
+
if (cmd === "umode") {
|
|
12
|
+
irc.raw("MODE", nick, ...args);
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
else if (cmd !== "mode") {
|
|
16
|
+
if (chan.type !== chan_1.ChanType.CHANNEL) {
|
|
17
|
+
chan.pushMessage(this, new msg_1.default({
|
|
18
|
+
type: msg_2.MessageType.ERROR,
|
|
19
|
+
text: `${cmd} command can only be used in channels.`,
|
|
20
|
+
}));
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const target = args.filter((arg) => arg !== "");
|
|
24
|
+
if (target.length === 0) {
|
|
25
|
+
chan.pushMessage(this, new msg_1.default({
|
|
26
|
+
type: msg_2.MessageType.ERROR,
|
|
27
|
+
text: `Usage: /${cmd} <nick> [...nick]`,
|
|
28
|
+
}));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const mode = {
|
|
32
|
+
op: "+o",
|
|
33
|
+
hop: "+h",
|
|
34
|
+
voice: "+v",
|
|
35
|
+
deop: "-o",
|
|
36
|
+
dehop: "-h",
|
|
37
|
+
devoice: "-v",
|
|
38
|
+
}[cmd];
|
|
39
|
+
const limit = parseInt(irc.network.supports("MODES")) || target.length;
|
|
40
|
+
for (let i = 0; i < target.length; i += limit) {
|
|
41
|
+
const targets = target.slice(i, i + limit);
|
|
42
|
+
const amode = `${mode[0]}${mode[1].repeat(targets.length)}`;
|
|
43
|
+
irc.raw("MODE", chan.name, amode, ...targets);
|
|
44
|
+
}
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (args.length === 0 || args[0][0] === "+" || args[0][0] === "-") {
|
|
48
|
+
args.unshift(chan.type === chan_1.ChanType.CHANNEL || chan.type === chan_1.ChanType.QUERY ? chan.name : nick);
|
|
49
|
+
}
|
|
50
|
+
irc.raw("MODE", ...args);
|
|
51
|
+
};
|
|
52
|
+
exports.default = {
|
|
53
|
+
commands,
|
|
54
|
+
input,
|
|
55
|
+
};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const msg_1 = __importDefault(require("../../models/msg"));
|
|
7
|
+
const msg_2 = require("../../../shared/types/msg");
|
|
8
|
+
const chan_1 = require("../../../shared/types/chan");
|
|
9
|
+
const fish_1 = require("../../utils/fish");
|
|
10
|
+
const commands = ["query", "msg", "say"];
|
|
11
|
+
function getTarget(cmd, args, chan) {
|
|
12
|
+
switch (cmd) {
|
|
13
|
+
case "msg":
|
|
14
|
+
case "query":
|
|
15
|
+
return args.shift();
|
|
16
|
+
default:
|
|
17
|
+
return chan.name;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const input = function (network, chan, cmd, args) {
|
|
21
|
+
let targetName = getTarget(cmd, args, chan);
|
|
22
|
+
if (cmd === "query") {
|
|
23
|
+
if (!targetName) {
|
|
24
|
+
chan.pushMessage(this, new msg_1.default({
|
|
25
|
+
type: msg_2.MessageType.ERROR,
|
|
26
|
+
text: "You cannot open a query window without an argument.",
|
|
27
|
+
}));
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const target = network.getChannel(targetName);
|
|
31
|
+
if (typeof target === "undefined") {
|
|
32
|
+
const char = targetName[0];
|
|
33
|
+
if (network.irc.network.options.CHANTYPES &&
|
|
34
|
+
network.irc.network.options.CHANTYPES.includes(char)) {
|
|
35
|
+
chan.pushMessage(this, new msg_1.default({
|
|
36
|
+
type: msg_2.MessageType.ERROR,
|
|
37
|
+
text: "You can not open query windows for channels, use /join instead.",
|
|
38
|
+
}));
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
for (let i = 0; i < network.irc.network.options.PREFIX.length; i++) {
|
|
42
|
+
if (network.irc.network.options.PREFIX[i].symbol === char) {
|
|
43
|
+
chan.pushMessage(this, new msg_1.default({
|
|
44
|
+
type: msg_2.MessageType.ERROR,
|
|
45
|
+
text: "You can not open query windows for names starting with a user prefix.",
|
|
46
|
+
}));
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const newChan = this.createChannel({
|
|
51
|
+
type: chan_1.ChanType.QUERY,
|
|
52
|
+
name: targetName,
|
|
53
|
+
});
|
|
54
|
+
this.emit("join", {
|
|
55
|
+
network: network.uuid,
|
|
56
|
+
chan: newChan.getFilteredClone(true),
|
|
57
|
+
shouldOpen: true,
|
|
58
|
+
index: network.addChannel(newChan),
|
|
59
|
+
});
|
|
60
|
+
this.save();
|
|
61
|
+
newChan.loadMessages(this, network);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (args.length === 0) {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
if (!targetName) {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
const msg = args.join(" ");
|
|
71
|
+
if (msg.length === 0) {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
// Determine if we should encrypt using FiSH for this target
|
|
75
|
+
const targetChan = network.getChannel(targetName) || (chan.name === targetName ? chan : undefined);
|
|
76
|
+
const key = targetChan?.blowfishKey;
|
|
77
|
+
const toSend = key ? "+OK " + (0, fish_1.fishEncryptPayload)(msg, key) : msg;
|
|
78
|
+
network.irc.say(targetName, toSend);
|
|
79
|
+
// If the IRCd does not support echo-message, simulate the message
|
|
80
|
+
// being sent back to us. Emit the same text we sent (encrypted or plain)
|
|
81
|
+
// so that inbound pipeline can decrypt and store plaintext.
|
|
82
|
+
if (!network.irc.network.cap.isEnabled("echo-message")) {
|
|
83
|
+
const parsedTarget = network.irc.network.extractTargetGroup(targetName);
|
|
84
|
+
let targetGroup = undefined;
|
|
85
|
+
if (parsedTarget) {
|
|
86
|
+
targetName = parsedTarget.target;
|
|
87
|
+
targetGroup = parsedTarget.target_group;
|
|
88
|
+
}
|
|
89
|
+
const channel = network.getChannel(targetName);
|
|
90
|
+
if (typeof channel !== "undefined") {
|
|
91
|
+
network.irc.emit("privmsg", {
|
|
92
|
+
nick: network.irc.user.nick,
|
|
93
|
+
ident: network.irc.user.username,
|
|
94
|
+
hostname: network.irc.user.host,
|
|
95
|
+
target: targetName,
|
|
96
|
+
group: targetGroup,
|
|
97
|
+
message: toSend,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return true;
|
|
102
|
+
};
|
|
103
|
+
exports.default = {
|
|
104
|
+
commands,
|
|
105
|
+
input,
|
|
106
|
+
};
|