From 3eb19135f558d59a32f6da53f557aab1e5261016 Mon Sep 17 00:00:00 2001 From: Reto Brunner Date: Thu, 15 Feb 2024 23:01:22 +0100 Subject: [PATCH 01/95] wip: msg --- client/js/socket.ts | 2 +- client/js/vue.ts | 1 - client/tsconfig.json | 1 - server/client.ts | 3 +- server/models/chan.ts | 3 +- server/models/msg.ts | 38 +------- server/models/network.ts | 3 +- server/plugins/inputs/action.ts | 3 +- server/plugins/inputs/ban.ts | 3 +- server/plugins/inputs/connect.ts | 3 +- server/plugins/inputs/ctcp.ts | 3 +- server/plugins/inputs/ignore.ts | 3 +- server/plugins/inputs/invite.ts | 3 +- server/plugins/inputs/kick.ts | 3 +- server/plugins/inputs/mode.ts | 3 +- server/plugins/inputs/msg.ts | 3 +- server/plugins/inputs/mute.ts | 3 +- server/plugins/inputs/nick.ts | 3 +- server/plugins/inputs/part.ts | 3 +- server/plugins/inputs/rejoin.ts | 3 +- server/plugins/inputs/topic.ts | 3 +- server/plugins/irc-events/away.ts | 3 +- server/plugins/irc-events/chghost.ts | 3 +- server/plugins/irc-events/connection.ts | 3 +- server/plugins/irc-events/ctcp.ts | 3 +- server/plugins/irc-events/error.ts | 3 +- server/plugins/irc-events/help.ts | 3 +- server/plugins/irc-events/info.ts | 3 +- server/plugins/irc-events/invite.ts | 3 +- server/plugins/irc-events/join.ts | 3 +- server/plugins/irc-events/kick.ts | 3 +- server/plugins/irc-events/link.ts | 18 +--- server/plugins/irc-events/message.ts | 3 +- server/plugins/irc-events/mode.ts | 3 +- server/plugins/irc-events/modelist.ts | 3 +- server/plugins/irc-events/motd.ts | 3 +- server/plugins/irc-events/nick.ts | 3 +- server/plugins/irc-events/part.ts | 3 +- server/plugins/irc-events/quit.ts | 3 +- server/plugins/irc-events/sasl.ts | 3 +- server/plugins/irc-events/topic.ts | 3 +- server/plugins/irc-events/unhandled.ts | 3 +- server/plugins/irc-events/whois.ts | 3 +- server/plugins/messageStorage/text.ts | 3 +- server/plugins/messageStorage/types.d.ts | 2 +- server/plugins/packages/publicClient.ts | 3 +- server/server.ts | 2 +- server/storageCleaner.ts | 2 +- server/tsconfig.json | 2 +- server/types/index.d.ts | 1 - shared/types/msg.ts | 98 +++++++++++++++++++++ {server => shared}/types/socket-events.d.ts | 0 52 files changed, 185 insertions(+), 102 deletions(-) create mode 100644 shared/types/msg.ts rename {server => shared}/types/socket-events.d.ts (100%) diff --git a/client/js/socket.ts b/client/js/socket.ts index f01b628d56..d475214253 100644 --- a/client/js/socket.ts +++ b/client/js/socket.ts @@ -1,5 +1,5 @@ import io, {Socket} from "socket.io-client"; -import type {ServerToClientEvents, ClientToServerEvents} from "../../server/types/socket-events"; +import type {ServerToClientEvents, ClientToServerEvents} from "../../shared/types/socket-events"; const socket: Socket = io({ transports: JSON.parse(document.body.dataset.transports || "['polling', 'websocket']"), diff --git a/client/js/vue.ts b/client/js/vue.ts index 09fe0bc688..7f94cba0d5 100644 --- a/client/js/vue.ts +++ b/client/js/vue.ts @@ -9,7 +9,6 @@ import {router} from "./router"; import socket from "./socket"; import eventbus from "./eventbus"; -import "./socket-events"; import "./webpush"; import "./keybinds"; import {LoungeWindow} from "./types"; diff --git a/client/tsconfig.json b/client/tsconfig.json index 2c7cbdcd6a..d848b3a924 100644 --- a/client/tsconfig.json +++ b/client/tsconfig.json @@ -6,7 +6,6 @@ ] /* Specifies a list of glob patterns that match files to be included in compilation. If no 'files' or 'include' property is present in a tsconfig.json, the compiler defaults to including all files in the containing directory and subdirectories except those specified by 'exclude'. Requires TypeScript version 2.0 or later. */, "files": [ "../package.json", - "../server/types/socket-events.d.ts", "../server/helper.ts", "../server/log.ts", "../server/config.ts", diff --git a/server/client.ts b/server/client.ts index 9f7c08d9ae..fc8ac8c7af 100644 --- a/server/client.ts +++ b/server/client.ts @@ -7,9 +7,10 @@ import colors from "chalk"; import log from "./log"; import Chan, {ChanConfig, Channel, ChanType} from "./models/chan"; -import Msg, {MessageType, UserInMessage} from "./models/msg"; +import Msg from "./models/msg"; import Config from "./config"; import {condensedTypes} from "../shared/irc"; +import {MessageType, UserInMessage} from "../shared/types/msg"; import inputs from "./plugins/inputs"; import PublicClient from "./plugins/packages/publicClient"; diff --git a/server/models/chan.ts b/server/models/chan.ts index 79d8a86cfd..77addedde3 100644 --- a/server/models/chan.ts +++ b/server/models/chan.ts @@ -2,11 +2,12 @@ import _ from "lodash"; import log from "../log"; import Config from "../config"; import User from "./user"; -import Msg, {MessageType} from "./msg"; +import Msg from "./msg"; import storage from "../plugins/storage"; import Client from "../client"; import Network from "./network"; import Prefix from "./prefix"; +import {MessageType} from "../../shared/types/msg"; export enum ChanType { CHANNEL = "channel", diff --git a/server/models/msg.ts b/server/models/msg.ts index 6a1d027c51..06420d5c89 100644 --- a/server/models/msg.ts +++ b/server/models/msg.ts @@ -1,41 +1,5 @@ import _ from "lodash"; -import {LinkPreview} from "../plugins/irc-events/link"; -import User from "./user"; - -export type UserInMessage = Partial & { - mode: string; -}; - -export enum MessageType { - UNHANDLED = "unhandled", - ACTION = "action", - AWAY = "away", - BACK = "back", - ERROR = "error", - INVITE = "invite", - JOIN = "join", - KICK = "kick", - LOGIN = "login", - LOGOUT = "logout", - MESSAGE = "message", - MODE = "mode", - MODE_CHANNEL = "mode_channel", - MODE_USER = "mode_user", // RPL_UMODEIS - MONOSPACE_BLOCK = "monospace_block", - NICK = "nick", - NOTICE = "notice", - PART = "part", - QUIT = "quit", - CTCP = "ctcp", - CTCP_REQUEST = "ctcp_request", - CHGHOST = "chghost", - TOPIC = "topic", - TOPIC_SET_BY = "topic_set_by", - WHOIS = "whois", - RAW = "raw", - PLUGIN = "plugin", - WALLOPS = "wallops", -} +import {MessageType, LinkPreview, UserInMessage} from "../../shared/types/msg"; class Msg { from!: UserInMessage; diff --git a/server/models/network.ts b/server/models/network.ts index 0a4f31e915..1952a3f1b7 100644 --- a/server/models/network.ts +++ b/server/models/network.ts @@ -2,13 +2,14 @@ import _ from "lodash"; import {v4 as uuidv4} from "uuid"; import IrcFramework, {Client as IRCClient} from "irc-framework"; import Chan, {ChanConfig, Channel, ChanType} from "./chan"; -import Msg, {MessageType} from "./msg"; +import Msg from "./msg"; import Prefix from "./prefix"; import Helper, {Hostmask} from "../helper"; import Config, {WebIRC} from "../config"; import STSPolicies from "../plugins/sts"; import ClientCertificate, {ClientCertificateType} from "../plugins/clientCertificate"; import Client from "../client"; +import {MessageType} from "../../shared/types/msg"; /** * List of keys which should be sent to the client by default. diff --git a/server/plugins/inputs/action.ts b/server/plugins/inputs/action.ts index 2b7bf65db5..a71f3312b7 100644 --- a/server/plugins/inputs/action.ts +++ b/server/plugins/inputs/action.ts @@ -1,6 +1,7 @@ import {PluginInputHandler} from "./index"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; import {ChanType} from "../../models/chan"; +import {MessageType} from "../../../shared/types/msg"; const commands = ["slap", "me"]; diff --git a/server/plugins/inputs/ban.ts b/server/plugins/inputs/ban.ts index b8a752b46c..5803653608 100644 --- a/server/plugins/inputs/ban.ts +++ b/server/plugins/inputs/ban.ts @@ -1,6 +1,7 @@ import {ChanType} from "../../models/chan"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; import {PluginInputHandler} from "./index"; +import {MessageType} from "../../../shared/types/msg"; const commands = ["ban", "unban", "banlist", "kickban"]; diff --git a/server/plugins/inputs/connect.ts b/server/plugins/inputs/connect.ts index 2e1c788e3e..b43f2f008c 100644 --- a/server/plugins/inputs/connect.ts +++ b/server/plugins/inputs/connect.ts @@ -1,5 +1,6 @@ -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; import {PluginInputHandler} from "./index"; +import {MessageType} from "../../../shared/types/msg"; const commands = ["connect", "server"]; const allowDisconnected = true; diff --git a/server/plugins/inputs/ctcp.ts b/server/plugins/inputs/ctcp.ts index efb4b5e53d..2f4be75686 100644 --- a/server/plugins/inputs/ctcp.ts +++ b/server/plugins/inputs/ctcp.ts @@ -1,5 +1,6 @@ -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; import {PluginInputHandler} from "./index"; +import {MessageType} from "../../../shared/types/msg"; const commands = ["ctcp"]; diff --git a/server/plugins/inputs/ignore.ts b/server/plugins/inputs/ignore.ts index a55e60303a..fa9330e027 100644 --- a/server/plugins/inputs/ignore.ts +++ b/server/plugins/inputs/ignore.ts @@ -1,8 +1,9 @@ -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; import Helper from "../../helper"; import {PluginInputHandler} from "./index"; import {IgnoreListItem} from "../../models/network"; import {ChanType, SpecialChanType} from "../../models/chan"; +import {MessageType} from "../../../shared/types/msg"; const commands = ["ignore", "unignore", "ignorelist"]; diff --git a/server/plugins/inputs/invite.ts b/server/plugins/inputs/invite.ts index ebe221a19b..797a487f5e 100644 --- a/server/plugins/inputs/invite.ts +++ b/server/plugins/inputs/invite.ts @@ -1,6 +1,7 @@ import {PluginInputHandler} from "./index"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; import {ChanType} from "../../models/chan"; +import {MessageType} from "../../../shared/types/msg"; const commands = ["invite", "invitelist"]; diff --git a/server/plugins/inputs/kick.ts b/server/plugins/inputs/kick.ts index 7bfcfe063d..6d09a95707 100644 --- a/server/plugins/inputs/kick.ts +++ b/server/plugins/inputs/kick.ts @@ -1,6 +1,7 @@ import {PluginInputHandler} from "./index"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; import {ChanType} from "../../models/chan"; +import {MessageType} from "../../../shared/types/msg"; const commands = ["kick"]; diff --git a/server/plugins/inputs/mode.ts b/server/plugins/inputs/mode.ts index 4e427682d1..8a5ff9d4b6 100644 --- a/server/plugins/inputs/mode.ts +++ b/server/plugins/inputs/mode.ts @@ -1,7 +1,8 @@ import {PluginInputHandler} from "./index"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; import {ChanType} from "../../models/chan"; +import {MessageType} from "../../../shared/types/msg"; const commands = ["mode", "umode", "op", "deop", "hop", "dehop", "voice", "devoice"]; diff --git a/server/plugins/inputs/msg.ts b/server/plugins/inputs/msg.ts index aa38400935..722b9f25e9 100644 --- a/server/plugins/inputs/msg.ts +++ b/server/plugins/inputs/msg.ts @@ -1,6 +1,7 @@ import {PluginInputHandler} from "./index"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; import Chan, {ChanType} from "../../models/chan"; +import {MessageType} from "../../../shared/types/msg"; const commands = ["query", "msg", "say"]; diff --git a/server/plugins/inputs/mute.ts b/server/plugins/inputs/mute.ts index bf553549bb..ce1187d9f5 100644 --- a/server/plugins/inputs/mute.ts +++ b/server/plugins/inputs/mute.ts @@ -2,9 +2,10 @@ import Chan from "../../models/chan"; import Network from "../../models/network"; import {PluginInputHandler} from "./index"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; import Client from "../../client"; +import {MessageType} from "../../../shared/types/msg"; const commands = ["mute", "unmute"]; const allowDisconnected = true; diff --git a/server/plugins/inputs/nick.ts b/server/plugins/inputs/nick.ts index 645096ab5b..90b7bd4213 100644 --- a/server/plugins/inputs/nick.ts +++ b/server/plugins/inputs/nick.ts @@ -1,6 +1,7 @@ import {PluginInputHandler} from "./index"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; +import {MessageType} from "../../../shared/types/msg"; const commands = ["nick"]; const allowDisconnected = true; diff --git a/server/plugins/inputs/part.ts b/server/plugins/inputs/part.ts index 76569889fe..858882d499 100644 --- a/server/plugins/inputs/part.ts +++ b/server/plugins/inputs/part.ts @@ -1,8 +1,9 @@ import {PluginInputHandler} from "./index"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; import Config from "../../config"; import {ChanType, ChanState} from "../../models/chan"; +import {MessageType} from "../../../shared/types/msg"; const commands = ["close", "leave", "part"]; const allowDisconnected = true; diff --git a/server/plugins/inputs/rejoin.ts b/server/plugins/inputs/rejoin.ts index 866ce3d06c..a64cd4a042 100644 --- a/server/plugins/inputs/rejoin.ts +++ b/server/plugins/inputs/rejoin.ts @@ -1,7 +1,8 @@ import {PluginInputHandler} from "./index"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; import {ChanType} from "../../models/chan"; +import {MessageType} from "../../../shared/types/msg"; const commands = ["cycle", "rejoin"]; diff --git a/server/plugins/inputs/topic.ts b/server/plugins/inputs/topic.ts index 843c64b136..242b170ec1 100644 --- a/server/plugins/inputs/topic.ts +++ b/server/plugins/inputs/topic.ts @@ -1,7 +1,8 @@ import {PluginInputHandler} from "./index"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; import {ChanType} from "../../models/chan"; +import {MessageType} from "../../../shared/types/msg"; const commands = ["topic"]; diff --git a/server/plugins/irc-events/away.ts b/server/plugins/irc-events/away.ts index 7256103f24..4212d2052f 100644 --- a/server/plugins/irc-events/away.ts +++ b/server/plugins/irc-events/away.ts @@ -1,6 +1,7 @@ import {IrcEventHandler} from "../../client"; import {ChanType} from "../../models/chan"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; +import {MessageType} from "../../../shared/types/msg"; export default function (irc, network) { const client = this; diff --git a/server/plugins/irc-events/chghost.ts b/server/plugins/irc-events/chghost.ts index 04bea483ba..3447576ea6 100644 --- a/server/plugins/irc-events/chghost.ts +++ b/server/plugins/irc-events/chghost.ts @@ -1,6 +1,7 @@ import {IrcEventHandler} from "../../client"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; +import {MessageType} from "../../../shared/types/msg"; export default function (irc, network) { const client = this; diff --git a/server/plugins/irc-events/connection.ts b/server/plugins/irc-events/connection.ts index 300db36be4..49bb4a1083 100644 --- a/server/plugins/irc-events/connection.ts +++ b/server/plugins/irc-events/connection.ts @@ -3,10 +3,11 @@ import _ from "lodash"; import {IrcEventHandler} from "../../client"; import log from "../../log"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; import Helper from "../../helper"; import Config from "../../config"; import {ChanType, ChanState} from "../../models/chan"; +import {MessageType} from "../../../shared/types/msg"; export default function (irc, network) { const client = this; diff --git a/server/plugins/irc-events/ctcp.ts b/server/plugins/irc-events/ctcp.ts index 758d09a7b5..672d447e11 100644 --- a/server/plugins/irc-events/ctcp.ts +++ b/server/plugins/irc-events/ctcp.ts @@ -1,9 +1,10 @@ import _ from "lodash"; import {IrcEventHandler} from "../../client"; import Helper from "../../helper"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; import User from "../../models/user"; import pkg from "../../../package.json"; +import {MessageType} from "../../../shared/types/msg"; const ctcpResponses = { CLIENTINFO: () => diff --git a/server/plugins/irc-events/error.ts b/server/plugins/irc-events/error.ts index b6890db0cb..4000f1351e 100644 --- a/server/plugins/irc-events/error.ts +++ b/server/plugins/irc-events/error.ts @@ -1,7 +1,8 @@ import {IrcEventHandler} from "../../client"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; import Config from "../../config"; +import {MessageType} from "../../../shared/types/msg"; export default function (irc, network) { const client = this; diff --git a/server/plugins/irc-events/help.ts b/server/plugins/irc-events/help.ts index 9bcaa3f669..f8442a794e 100644 --- a/server/plugins/irc-events/help.ts +++ b/server/plugins/irc-events/help.ts @@ -1,5 +1,6 @@ -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; import {IrcEventHandler} from "../../client"; +import {MessageType} from "../../../shared/types/msg"; export default function (irc, network) { const client = this; diff --git a/server/plugins/irc-events/info.ts b/server/plugins/irc-events/info.ts index 8e0f3359dd..7cb66d3000 100644 --- a/server/plugins/irc-events/info.ts +++ b/server/plugins/irc-events/info.ts @@ -1,5 +1,6 @@ -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; import {IrcEventHandler} from "../../client"; +import {MessageType} from "../../../shared/types/msg"; export default function (irc, network) { const client = this; diff --git a/server/plugins/irc-events/invite.ts b/server/plugins/irc-events/invite.ts index f6dc65245c..b9a73d7644 100644 --- a/server/plugins/irc-events/invite.ts +++ b/server/plugins/irc-events/invite.ts @@ -1,6 +1,7 @@ import {IrcEventHandler} from "../../client"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; +import {MessageType} from "../../../shared/types/msg"; export default function (irc, network) { const client = this; diff --git a/server/plugins/irc-events/join.ts b/server/plugins/irc-events/join.ts index 0c758f123f..2bc7e96aae 100644 --- a/server/plugins/irc-events/join.ts +++ b/server/plugins/irc-events/join.ts @@ -1,7 +1,8 @@ -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; import User from "../../models/user"; import type {IrcEventHandler} from "../../client"; import {ChanState} from "../../models/chan"; +import {MessageType} from "../../../shared/types/msg"; export default function (irc, network) { const client = this; diff --git a/server/plugins/irc-events/kick.ts b/server/plugins/irc-events/kick.ts index 44579b637b..d1b5110d62 100644 --- a/server/plugins/irc-events/kick.ts +++ b/server/plugins/irc-events/kick.ts @@ -1,8 +1,9 @@ import {IrcEventHandler} from "../../client"; import {ChanState} from "../../models/chan"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; import User from "../../models/user"; +import {MessageType} from "../../../shared/types/msg"; export default function (irc, network) { const client = this; diff --git a/server/plugins/irc-events/link.ts b/server/plugins/irc-events/link.ts index 63a86dc00f..ee0ba6bd93 100644 --- a/server/plugins/irc-events/link.ts +++ b/server/plugins/irc-events/link.ts @@ -6,6 +6,7 @@ import mime from "mime-types"; import log from "../../log"; import Config from "../../config"; import {findLinksWithSchema} from "../../../shared/linkify"; +import {LinkPreview} from "../../../shared/types/msg"; import storage from "../storage"; import Client from "../../client"; import Chan from "../../models/chan"; @@ -20,23 +21,6 @@ const currentFetchPromises = new Map>(); const imageTypeRegex = /^image\/.+/; const mediaTypeRegex = /^(audio|video)\/.+/; -export type LinkPreview = { - type: string; - head: string; - body: string; - thumb: string; - size: number; - link: string; // Send original matched link to the client - shown?: boolean | null; - error?: string; - message?: string; - - media?: string; - mediaType?: string; - maxSize?: number; - thumbActualUrl?: string; -}; - export default function (client: Client, chan: Chan, msg: Msg, cleanText: string) { if (!Config.values.prefetch) { return; diff --git a/server/plugins/irc-events/message.ts b/server/plugins/irc-events/message.ts index 393f247de5..41afd41ed0 100644 --- a/server/plugins/irc-events/message.ts +++ b/server/plugins/irc-events/message.ts @@ -1,10 +1,11 @@ -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; import LinkPrefetch from "./link"; import {cleanIrcMessage} from "../../../shared/irc"; import Helper from "../../helper"; import {IrcEventHandler} from "../../client"; import Chan, {ChanType} from "../../models/chan"; import User from "../../models/user"; +import {MessageType} from "../../../shared/types/msg"; const nickRegExp = /(?:\x03[0-9]{1,2}(?:,[0-9]{1,2})?)?([\w[\]\\`^{|}-]+)/g; diff --git a/server/plugins/irc-events/mode.ts b/server/plugins/irc-events/mode.ts index b1f658458c..79126d871f 100644 --- a/server/plugins/irc-events/mode.ts +++ b/server/plugins/irc-events/mode.ts @@ -1,7 +1,8 @@ import _ from "lodash"; import {IrcEventHandler} from "../../client"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; +import {MessageType} from "../../../shared/types/msg"; export default function (irc, network) { const client = this; diff --git a/server/plugins/irc-events/modelist.ts b/server/plugins/irc-events/modelist.ts index 2c429bf5e7..f91a093ba9 100644 --- a/server/plugins/irc-events/modelist.ts +++ b/server/plugins/irc-events/modelist.ts @@ -1,7 +1,8 @@ import {IrcEventHandler} from "../../client"; import {SpecialChanType, ChanType} from "../../models/chan"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; +import {MessageType} from "../../../shared/types/msg"; export default function (irc, network) { const client = this; diff --git a/server/plugins/irc-events/motd.ts b/server/plugins/irc-events/motd.ts index cffce33bb1..0076570a74 100644 --- a/server/plugins/irc-events/motd.ts +++ b/server/plugins/irc-events/motd.ts @@ -1,6 +1,7 @@ import {IrcEventHandler} from "../../client"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; +import {MessageType} from "../../../shared/types/msg"; export default function (irc, network) { const client = this; diff --git a/server/plugins/irc-events/nick.ts b/server/plugins/irc-events/nick.ts index 51b3f81f25..994216537d 100644 --- a/server/plugins/irc-events/nick.ts +++ b/server/plugins/irc-events/nick.ts @@ -1,6 +1,7 @@ import {IrcEventHandler} from "../../client"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; +import {MessageType} from "../../../shared/types/msg"; export default function (irc, network) { const client = this; diff --git a/server/plugins/irc-events/part.ts b/server/plugins/irc-events/part.ts index 6323ad052f..5f0e419d8d 100644 --- a/server/plugins/irc-events/part.ts +++ b/server/plugins/irc-events/part.ts @@ -1,6 +1,7 @@ import {IrcEventHandler} from "../../client"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; +import {MessageType} from "../../../shared/types/msg"; export default function (irc, network) { const client = this; diff --git a/server/plugins/irc-events/quit.ts b/server/plugins/irc-events/quit.ts index 7fd637d757..7439345464 100644 --- a/server/plugins/irc-events/quit.ts +++ b/server/plugins/irc-events/quit.ts @@ -1,6 +1,7 @@ import {IrcEventHandler} from "../../client"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; +import {MessageType} from "../../../shared/types/msg"; export default function (irc, network) { const client = this; diff --git a/server/plugins/irc-events/sasl.ts b/server/plugins/irc-events/sasl.ts index b486cacee3..8211d1e339 100644 --- a/server/plugins/irc-events/sasl.ts +++ b/server/plugins/irc-events/sasl.ts @@ -1,6 +1,7 @@ import {IrcEventHandler} from "../../client"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; +import {MessageType} from "../../../shared/types/msg"; export default function (irc, network) { const client = this; diff --git a/server/plugins/irc-events/topic.ts b/server/plugins/irc-events/topic.ts index c5bc6d5b99..ba9f9de586 100644 --- a/server/plugins/irc-events/topic.ts +++ b/server/plugins/irc-events/topic.ts @@ -1,6 +1,7 @@ import {IrcEventHandler} from "../../client"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; +import {MessageType} from "../../../shared/types/msg"; export default function (irc, network) { const client = this; diff --git a/server/plugins/irc-events/unhandled.ts b/server/plugins/irc-events/unhandled.ts index 6a4997f448..98dd9f0168 100644 --- a/server/plugins/irc-events/unhandled.ts +++ b/server/plugins/irc-events/unhandled.ts @@ -1,6 +1,7 @@ import {IrcEventHandler} from "../../client"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; +import {MessageType} from "../../../shared/types/msg"; export default function (irc, network) { const client = this; diff --git a/server/plugins/irc-events/whois.ts b/server/plugins/irc-events/whois.ts index 67fdf3ff0f..97cdaacb0a 100644 --- a/server/plugins/irc-events/whois.ts +++ b/server/plugins/irc-events/whois.ts @@ -1,7 +1,8 @@ import {IrcEventHandler} from "../../client"; import {ChanType} from "../../models/chan"; -import Msg, {MessageType} from "../../models/msg"; +import Msg from "../../models/msg"; +import {MessageType} from "../../../shared/types/msg"; export default function (irc, network) { const client = this; diff --git a/server/plugins/messageStorage/text.ts b/server/plugins/messageStorage/text.ts index 51214347a9..20ca8ac9f9 100644 --- a/server/plugins/messageStorage/text.ts +++ b/server/plugins/messageStorage/text.ts @@ -6,8 +6,9 @@ import filenamify from "filenamify"; import Config from "../../config"; import {MessageStorage} from "./types"; import Channel from "../../models/chan"; -import {Message, MessageType} from "../../models/msg"; +import {Message} from "../../models/msg"; import Network from "../../models/network"; +import {MessageType} from "../../../shared/types/msg"; class TextFileMessageStorage implements MessageStorage { isEnabled: boolean; diff --git a/server/plugins/messageStorage/types.d.ts b/server/plugins/messageStorage/types.d.ts index 7e17ba541e..681d0353d6 100644 --- a/server/plugins/messageStorage/types.d.ts +++ b/server/plugins/messageStorage/types.d.ts @@ -4,7 +4,7 @@ import {Channel} from "../../models/channel"; import {Message} from "../../models/message"; import {Network} from "../../models/network"; import Client from "../../client"; -import type {MessageType} from "../../models/msg"; +import type {MessageType} from "../../../shared/types/msg"; export type DeletionRequest = { olderThanDays: number; diff --git a/server/plugins/packages/publicClient.ts b/server/plugins/packages/publicClient.ts index 109b1c4dec..5774b00632 100644 --- a/server/plugins/packages/publicClient.ts +++ b/server/plugins/packages/publicClient.ts @@ -1,7 +1,8 @@ import {PackageInfo} from "./index"; import Client from "../../client"; import Chan from "../../models/chan"; -import Msg, {MessageType, UserInMessage} from "../../models/msg"; +import Msg from "../../models/msg"; +import {MessageType, UserInMessage} from "../../../shared/types/msg"; export default class PublicClient { private client: Client; diff --git a/server/server.ts b/server/server.ts index 389872184a..562d16a7c6 100644 --- a/server/server.ts +++ b/server/server.ts @@ -31,7 +31,7 @@ import type { ServerToClientEvents, InterServerEvents, SocketData, -} from "./types/socket-events"; +} from "../shared/types/socket-events"; type ServerOptions = { dev: boolean; diff --git a/server/storageCleaner.ts b/server/storageCleaner.ts index cad486cce5..067452d762 100644 --- a/server/storageCleaner.ts +++ b/server/storageCleaner.ts @@ -1,8 +1,8 @@ import SqliteMessageStorage from "./plugins/messageStorage/sqlite"; -import {MessageType} from "./models/msg"; import Config from "./config"; import {DeletionRequest} from "./plugins/messageStorage/types"; import log from "./log"; +import {MessageType} from "../shared/types/msg"; const status_types = [ MessageType.AWAY, diff --git a/server/tsconfig.json b/server/tsconfig.json index 06045646e8..86ad13ec1a 100644 --- a/server/tsconfig.json +++ b/server/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../tsconfig.base.json" /* Path to base configuration file to inherit from. Requires TypeScript version 2.1 or later. */, "include": [ - "**/*", + ".", "../shared/" ] /* Specifies a list of glob patterns that match files to be included in compilation. If no 'files' or 'include' property is present in a tsconfig.json, the compiler defaults to including all files in the containing directory and subdirectories except those specified by 'exclude'. Requires TypeScript version 2.0 or later. */, "files": [ diff --git a/server/types/index.d.ts b/server/types/index.d.ts index 6ca0976af4..0959592840 100644 --- a/server/types/index.d.ts +++ b/server/types/index.d.ts @@ -1,2 +1 @@ import "./modules"; -import "./socket-events"; diff --git a/shared/types/msg.ts b/shared/types/msg.ts new file mode 100644 index 0000000000..07ebfa20d8 --- /dev/null +++ b/shared/types/msg.ts @@ -0,0 +1,98 @@ +export enum MessageType { + UNHANDLED = "unhandled", + ACTION = "action", + AWAY = "away", + BACK = "back", + ERROR = "error", + INVITE = "invite", + JOIN = "join", + KICK = "kick", + LOGIN = "login", + LOGOUT = "logout", + MESSAGE = "message", + MODE = "mode", + MODE_CHANNEL = "mode_channel", + MODE_USER = "mode_user", // RPL_UMODEIS + MONOSPACE_BLOCK = "monospace_block", + NICK = "nick", + NOTICE = "notice", + PART = "part", + QUIT = "quit", + CTCP = "ctcp", + CTCP_REQUEST = "ctcp_request", + CHGHOST = "chghost", + TOPIC = "topic", + TOPIC_SET_BY = "topic_set_by", + WHOIS = "whois", + RAW = "raw", + PLUGIN = "plugin", + WALLOPS = "wallops", +} + +export type SharedUser = { + modes: string[]; + // Users in the channel have only one mode assigned + mode: string; + away: string; + nick: string; + lastMessage: number; +}; + +export type UserInMessage = Partial & { + mode: string; +}; + +export type LinkPreview = { + type: string; + head: string; + body: string; + thumb: string; + size: number; + link: string; // Send original matched link to the client + shown?: boolean | null; + error?: string; + message?: string; + + media?: string; + mediaType?: string; + maxSize?: number; + thumbActualUrl?: string; +}; + +export type SharedMsg = { + from?: UserInMessage; + id?: number; + previews?: LinkPreview[]; + text?: string; + type?: MessageType; + self?: boolean; + time?: Date; + hostmask?: string; + target?: UserInMessage; + // TODO: new_nick is only on MessageType.NICK, + // we should probably make Msgs that extend this class and use those + // throughout. I'll leave any similar fields below. + new_nick?: string; + highlight?: boolean; + showInActive?: boolean; + new_ident?: string; + new_host?: string; + ctcpMessage?: string; + command?: string; + invitedYou?: boolean; + gecos?: string; + account?: boolean; + + // these are all just for error: + error?: string; + nick?: string; + channel?: string; + reason?: string; + + raw_modes?: any; + when?: Date; + whois?: any; + users?: UserInMessage[] | string[]; + statusmsgGroup?: string; + params?: string[]; +}; diff --git a/server/types/socket-events.d.ts b/shared/types/socket-events.d.ts similarity index 100% rename from server/types/socket-events.d.ts rename to shared/types/socket-events.d.ts From 68ba13ca12b4f67b249fc6b5f431da543febee0a Mon Sep 17 00:00:00 2001 From: Reto Brunner Date: Thu, 15 Feb 2024 23:29:41 +0100 Subject: [PATCH 02/95] wip: searchquery --- client/components/Windows/SearchResults.vue | 2 +- client/js/store.ts | 2 +- server/client.ts | 3 ++- server/plugins/messageStorage/sqlite.ts | 3 ++- server/plugins/messageStorage/types.d.ts | 8 +------- shared/types/storage.ts | 6 ++++++ 6 files changed, 13 insertions(+), 11 deletions(-) create mode 100644 shared/types/storage.ts diff --git a/client/components/Windows/SearchResults.vue b/client/components/Windows/SearchResults.vue index bc0c153d70..b182f9a0ef 100644 --- a/client/components/Windows/SearchResults.vue +++ b/client/components/Windows/SearchResults.vue @@ -106,7 +106,7 @@ import type {ClientMessage} from "../../js/types"; import {useStore} from "../../js/store"; import {useRoute, useRouter} from "vue-router"; import {switchToChannel} from "../../js/router"; -import {SearchQuery} from "../../../server/plugins/messageStorage/types"; +import {SearchQuery} from "../../../shared/types/storage"; export default defineComponent({ name: "SearchResults", diff --git a/client/js/store.ts b/client/js/store.ts index 41968e66d0..8962bb46d1 100644 --- a/client/js/store.ts +++ b/client/js/store.ts @@ -15,7 +15,7 @@ import type { import type {InjectionKey} from "vue"; import {SettingsState} from "./settings"; -import {SearchQuery} from "../../server/plugins/messageStorage/types"; +import {SearchQuery} from "../../shared/types/storage"; const appName = document.title; diff --git a/server/client.ts b/server/client.ts index fc8ac8c7af..8464b9dc08 100644 --- a/server/client.ts +++ b/server/client.ts @@ -18,8 +18,9 @@ import SqliteMessageStorage from "./plugins/messageStorage/sqlite"; import TextFileMessageStorage from "./plugins/messageStorage/text"; import Network, {IgnoreListItem, NetworkConfig, NetworkWithIrcFramework} from "./models/network"; import ClientManager from "./clientManager"; -import {MessageStorage, SearchQuery, SearchResponse} from "./plugins/messageStorage/types"; +import {MessageStorage, SearchResponse} from "./plugins/messageStorage/types"; import {StorageCleaner} from "./storageCleaner"; +import {SearchQuery} from "../shared/types/storage"; type OrderItem = Chan["id"] | Network["uuid"]; type Order = OrderItem[]; diff --git a/server/plugins/messageStorage/sqlite.ts b/server/plugins/messageStorage/sqlite.ts index 713f108fb8..ef0ad0877a 100644 --- a/server/plugins/messageStorage/sqlite.ts +++ b/server/plugins/messageStorage/sqlite.ts @@ -7,8 +7,9 @@ import Config from "../../config"; import Msg, {Message} from "../../models/msg"; import Chan, {Channel} from "../../models/chan"; import Helper from "../../helper"; -import type {SearchResponse, SearchQuery, SearchableMessageStorage, DeletionRequest} from "./types"; +import type {SearchResponse, SearchableMessageStorage, DeletionRequest} from "./types"; import Network from "../../models/network"; +import {SearchQuery} from "../../../shared/types/storage"; // TODO; type let sqlite3: any; diff --git a/server/plugins/messageStorage/types.d.ts b/server/plugins/messageStorage/types.d.ts index 681d0353d6..37925cef53 100644 --- a/server/plugins/messageStorage/types.d.ts +++ b/server/plugins/messageStorage/types.d.ts @@ -5,6 +5,7 @@ import {Message} from "../../models/message"; import {Network} from "../../models/network"; import Client from "../../client"; import type {MessageType} from "../../../shared/types/msg"; +import {SearchQuery} from "../../../shared/types/storage"; export type DeletionRequest = { olderThanDays: number; @@ -28,13 +29,6 @@ interface MessageStorage { canProvideMessages(): boolean; } -export type SearchQuery = { - searchTerm: string; - networkUuid: string; - channelName: string; - offset: number; -}; - export type SearchResponse = SearchQuery & { results: Message[]; }; diff --git a/shared/types/storage.ts b/shared/types/storage.ts new file mode 100644 index 0000000000..9b618ca85b --- /dev/null +++ b/shared/types/storage.ts @@ -0,0 +1,6 @@ +export type SearchQuery = { + searchTerm: string; + networkUuid: string; + channelName: string; + offset: number; +}; From b67e4699f5678a6b29e7aa472c95cb29db7321a5 Mon Sep 17 00:00:00 2001 From: Reto Brunner Date: Sat, 24 Feb 2024 10:55:42 +0100 Subject: [PATCH 03/95] wip sharedmsg in client --- client/components/MessageList.vue | 6 +++--- client/js/types.d.ts | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/client/components/MessageList.vue b/client/components/MessageList.vue index 7de87d0825..62215e21dd 100644 --- a/client/components/MessageList.vue +++ b/client/components/MessageList.vue @@ -79,7 +79,7 @@ import { } from "vue"; import {useStore} from "../js/store"; import {ClientChan, ClientMessage, ClientNetwork, ClientLinkPreview} from "../js/types"; -import Msg from "../../server/models/msg"; +import {SharedMsg} from "../../shared/types/msg"; type CondensedMessageContainer = { type: "condensed"; @@ -242,7 +242,7 @@ export default defineComponent({ }); const shouldDisplayDateMarker = ( - message: Msg | ClientMessage | CondensedMessageContainer, + message: SharedMsg | ClientMessage | CondensedMessageContainer, id: number ) => { const previousMessage = condensedMessages.value[id - 1]; @@ -270,7 +270,7 @@ export default defineComponent({ return false; }; - const isPreviousSource = (currentMessage: ClientMessage | Msg, id: number) => { + const isPreviousSource = (currentMessage: ClientMessage | SharedMsg, id: number) => { const previousMessage = condensedMessages.value[id - 1]; return !!( previousMessage && diff --git a/client/js/types.d.ts b/client/js/types.d.ts index e2d0ff1497..c58557b620 100644 --- a/client/js/types.d.ts +++ b/client/js/types.d.ts @@ -3,7 +3,7 @@ import {defineComponent} from "vue"; import Chan from "../../server/models/chan"; import Network from "../../server/models/network"; import User from "../../server/models/user"; -import Message from "../../server/models/msg"; +import SharedMessage from "../../shared/types/msg"; import {Mention} from "../../server/client"; import {ClientConfiguration} from "../../server/server"; import {LinkPreview} from "../../server/plugins/irc-events/link"; @@ -20,8 +20,8 @@ type ClientUser = User & { // }; -type ClientMessage = Omit & { - time: number; +type ClientMessage = Omit & { + time: Date; users: string[]; }; From 3f0ee6a9618f7fa8af982149a03c4fdb0b739632 Mon Sep 17 00:00:00 2001 From: Reto Brunner Date: Sat, 24 Feb 2024 11:13:11 +0100 Subject: [PATCH 04/95] move chan enums --- server/client.ts | 3 ++- server/models/chan.ts | 20 +------------------- server/models/network.ts | 3 ++- server/plugins/inputs/action.ts | 2 +- server/plugins/inputs/ban.ts | 2 +- server/plugins/inputs/ignore.ts | 2 +- server/plugins/inputs/invite.ts | 2 +- server/plugins/inputs/kick.ts | 2 +- server/plugins/inputs/mode.ts | 2 +- server/plugins/inputs/msg.ts | 3 ++- server/plugins/inputs/part.ts | 2 +- server/plugins/inputs/rejoin.ts | 2 +- server/plugins/inputs/topic.ts | 2 +- server/plugins/irc-events/away.ts | 2 +- server/plugins/irc-events/connection.ts | 2 +- server/plugins/irc-events/join.ts | 2 +- server/plugins/irc-events/kick.ts | 2 +- server/plugins/irc-events/list.ts | 3 ++- server/plugins/irc-events/message.ts | 3 ++- server/plugins/irc-events/modelist.ts | 2 +- server/plugins/irc-events/whois.ts | 2 +- server/server.ts | 2 +- 22 files changed, 27 insertions(+), 40 deletions(-) diff --git a/server/client.ts b/server/client.ts index 8464b9dc08..d1034383ee 100644 --- a/server/client.ts +++ b/server/client.ts @@ -6,7 +6,7 @@ import crypto from "crypto"; import colors from "chalk"; import log from "./log"; -import Chan, {ChanConfig, Channel, ChanType} from "./models/chan"; +import Chan, {ChanConfig} from "./models/chan"; import Msg from "./models/msg"; import Config from "./config"; import {condensedTypes} from "../shared/irc"; @@ -21,6 +21,7 @@ import ClientManager from "./clientManager"; import {MessageStorage, SearchResponse} from "./plugins/messageStorage/types"; import {StorageCleaner} from "./storageCleaner"; import {SearchQuery} from "../shared/types/storage"; +import {ChanType} from "../shared/types/chan"; type OrderItem = Chan["id"] | Network["uuid"]; type Order = OrderItem[]; diff --git a/server/models/chan.ts b/server/models/chan.ts index 77addedde3..d0decbdc1f 100644 --- a/server/models/chan.ts +++ b/server/models/chan.ts @@ -8,25 +8,7 @@ import Client from "../client"; import Network from "./network"; import Prefix from "./prefix"; import {MessageType} from "../../shared/types/msg"; - -export enum ChanType { - CHANNEL = "channel", - LOBBY = "lobby", - QUERY = "query", - SPECIAL = "special", -} - -export enum SpecialChanType { - BANLIST = "list_bans", - INVITELIST = "list_invites", - CHANNELLIST = "list_channels", - IGNORELIST = "list_ignored", -} - -export enum ChanState { - PARTED = 0, - JOINED = 1, -} +import {ChanType, SpecialChanType, ChanState} from "../../shared/types/chan"; // eslint-disable-next-line no-use-before-define export type FilteredChannel = Chan & { diff --git a/server/models/network.ts b/server/models/network.ts index 1952a3f1b7..07e65f1be7 100644 --- a/server/models/network.ts +++ b/server/models/network.ts @@ -1,7 +1,7 @@ import _ from "lodash"; import {v4 as uuidv4} from "uuid"; import IrcFramework, {Client as IRCClient} from "irc-framework"; -import Chan, {ChanConfig, Channel, ChanType} from "./chan"; +import Chan, {ChanConfig, Channel} from "./chan"; import Msg from "./msg"; import Prefix from "./prefix"; import Helper, {Hostmask} from "../helper"; @@ -10,6 +10,7 @@ import STSPolicies from "../plugins/sts"; import ClientCertificate, {ClientCertificateType} from "../plugins/clientCertificate"; import Client from "../client"; import {MessageType} from "../../shared/types/msg"; +import {ChanType} from "../../shared/types/chan"; /** * List of keys which should be sent to the client by default. diff --git a/server/plugins/inputs/action.ts b/server/plugins/inputs/action.ts index a71f3312b7..b4fd1000a2 100644 --- a/server/plugins/inputs/action.ts +++ b/server/plugins/inputs/action.ts @@ -1,7 +1,7 @@ import {PluginInputHandler} from "./index"; import Msg from "../../models/msg"; -import {ChanType} from "../../models/chan"; import {MessageType} from "../../../shared/types/msg"; +import {ChanType} from "../../../shared/types/chan"; const commands = ["slap", "me"]; diff --git a/server/plugins/inputs/ban.ts b/server/plugins/inputs/ban.ts index 5803653608..c67cd43370 100644 --- a/server/plugins/inputs/ban.ts +++ b/server/plugins/inputs/ban.ts @@ -1,7 +1,7 @@ -import {ChanType} from "../../models/chan"; import Msg from "../../models/msg"; import {PluginInputHandler} from "./index"; import {MessageType} from "../../../shared/types/msg"; +import {ChanType} from "../../../shared/types/chan"; const commands = ["ban", "unban", "banlist", "kickban"]; diff --git a/server/plugins/inputs/ignore.ts b/server/plugins/inputs/ignore.ts index fa9330e027..f7a5709308 100644 --- a/server/plugins/inputs/ignore.ts +++ b/server/plugins/inputs/ignore.ts @@ -2,8 +2,8 @@ import Msg from "../../models/msg"; import Helper from "../../helper"; import {PluginInputHandler} from "./index"; import {IgnoreListItem} from "../../models/network"; -import {ChanType, SpecialChanType} from "../../models/chan"; import {MessageType} from "../../../shared/types/msg"; +import {ChanType, SpecialChanType} from "../../../shared/types/chan"; const commands = ["ignore", "unignore", "ignorelist"]; diff --git a/server/plugins/inputs/invite.ts b/server/plugins/inputs/invite.ts index 797a487f5e..e93b5f5487 100644 --- a/server/plugins/inputs/invite.ts +++ b/server/plugins/inputs/invite.ts @@ -1,7 +1,7 @@ import {PluginInputHandler} from "./index"; import Msg from "../../models/msg"; -import {ChanType} from "../../models/chan"; import {MessageType} from "../../../shared/types/msg"; +import {ChanType} from "../../../shared/types/chan"; const commands = ["invite", "invitelist"]; diff --git a/server/plugins/inputs/kick.ts b/server/plugins/inputs/kick.ts index 6d09a95707..7362bd9e8c 100644 --- a/server/plugins/inputs/kick.ts +++ b/server/plugins/inputs/kick.ts @@ -1,7 +1,7 @@ import {PluginInputHandler} from "./index"; import Msg from "../../models/msg"; -import {ChanType} from "../../models/chan"; import {MessageType} from "../../../shared/types/msg"; +import {ChanType} from "../../../shared/types/chan"; const commands = ["kick"]; diff --git a/server/plugins/inputs/mode.ts b/server/plugins/inputs/mode.ts index 8a5ff9d4b6..d42591721a 100644 --- a/server/plugins/inputs/mode.ts +++ b/server/plugins/inputs/mode.ts @@ -1,8 +1,8 @@ import {PluginInputHandler} from "./index"; import Msg from "../../models/msg"; -import {ChanType} from "../../models/chan"; import {MessageType} from "../../../shared/types/msg"; +import {ChanType} from "../../../shared/types/chan"; const commands = ["mode", "umode", "op", "deop", "hop", "dehop", "voice", "devoice"]; diff --git a/server/plugins/inputs/msg.ts b/server/plugins/inputs/msg.ts index 722b9f25e9..e3a6502fbc 100644 --- a/server/plugins/inputs/msg.ts +++ b/server/plugins/inputs/msg.ts @@ -1,7 +1,8 @@ import {PluginInputHandler} from "./index"; import Msg from "../../models/msg"; -import Chan, {ChanType} from "../../models/chan"; +import Chan from "../../models/chan"; import {MessageType} from "../../../shared/types/msg"; +import {ChanType} from "../../../shared/types/chan"; const commands = ["query", "msg", "say"]; diff --git a/server/plugins/inputs/part.ts b/server/plugins/inputs/part.ts index 858882d499..2842e4f471 100644 --- a/server/plugins/inputs/part.ts +++ b/server/plugins/inputs/part.ts @@ -2,8 +2,8 @@ import {PluginInputHandler} from "./index"; import Msg from "../../models/msg"; import Config from "../../config"; -import {ChanType, ChanState} from "../../models/chan"; import {MessageType} from "../../../shared/types/msg"; +import {ChanType, ChanState} from "../../../shared/types/chan"; const commands = ["close", "leave", "part"]; const allowDisconnected = true; diff --git a/server/plugins/inputs/rejoin.ts b/server/plugins/inputs/rejoin.ts index a64cd4a042..0dc7f2d7a2 100644 --- a/server/plugins/inputs/rejoin.ts +++ b/server/plugins/inputs/rejoin.ts @@ -1,8 +1,8 @@ import {PluginInputHandler} from "./index"; import Msg from "../../models/msg"; -import {ChanType} from "../../models/chan"; import {MessageType} from "../../../shared/types/msg"; +import {ChanType} from "../../../shared/types/chan"; const commands = ["cycle", "rejoin"]; diff --git a/server/plugins/inputs/topic.ts b/server/plugins/inputs/topic.ts index 242b170ec1..5fb7699401 100644 --- a/server/plugins/inputs/topic.ts +++ b/server/plugins/inputs/topic.ts @@ -1,8 +1,8 @@ import {PluginInputHandler} from "./index"; import Msg from "../../models/msg"; -import {ChanType} from "../../models/chan"; import {MessageType} from "../../../shared/types/msg"; +import {ChanType} from "../../../shared/types/chan"; const commands = ["topic"]; diff --git a/server/plugins/irc-events/away.ts b/server/plugins/irc-events/away.ts index 4212d2052f..af0460a4b2 100644 --- a/server/plugins/irc-events/away.ts +++ b/server/plugins/irc-events/away.ts @@ -1,7 +1,7 @@ import {IrcEventHandler} from "../../client"; -import {ChanType} from "../../models/chan"; import Msg from "../../models/msg"; import {MessageType} from "../../../shared/types/msg"; +import {ChanType} from "../../../shared/types/chan"; export default function (irc, network) { const client = this; diff --git a/server/plugins/irc-events/connection.ts b/server/plugins/irc-events/connection.ts index 49bb4a1083..0c6041ff40 100644 --- a/server/plugins/irc-events/connection.ts +++ b/server/plugins/irc-events/connection.ts @@ -6,8 +6,8 @@ import log from "../../log"; import Msg from "../../models/msg"; import Helper from "../../helper"; import Config from "../../config"; -import {ChanType, ChanState} from "../../models/chan"; import {MessageType} from "../../../shared/types/msg"; +import {ChanType, ChanState} from "../../../shared/types/chan"; export default function (irc, network) { const client = this; diff --git a/server/plugins/irc-events/join.ts b/server/plugins/irc-events/join.ts index 2bc7e96aae..92be88113b 100644 --- a/server/plugins/irc-events/join.ts +++ b/server/plugins/irc-events/join.ts @@ -1,8 +1,8 @@ import Msg from "../../models/msg"; import User from "../../models/user"; import type {IrcEventHandler} from "../../client"; -import {ChanState} from "../../models/chan"; import {MessageType} from "../../../shared/types/msg"; +import {ChanState} from "../../../shared/types/chan"; export default function (irc, network) { const client = this; diff --git a/server/plugins/irc-events/kick.ts b/server/plugins/irc-events/kick.ts index d1b5110d62..b40b72fd34 100644 --- a/server/plugins/irc-events/kick.ts +++ b/server/plugins/irc-events/kick.ts @@ -1,9 +1,9 @@ import {IrcEventHandler} from "../../client"; -import {ChanState} from "../../models/chan"; import Msg from "../../models/msg"; import User from "../../models/user"; import {MessageType} from "../../../shared/types/msg"; +import {ChanState} from "../../../shared/types/chan"; export default function (irc, network) { const client = this; diff --git a/server/plugins/irc-events/list.ts b/server/plugins/irc-events/list.ts index 59cf73fc47..d93c210847 100644 --- a/server/plugins/irc-events/list.ts +++ b/server/plugins/irc-events/list.ts @@ -1,6 +1,7 @@ import {IrcEventHandler} from "../../client"; -import Chan, {ChanType, SpecialChanType} from "../../models/chan"; +import Chan from "../../models/chan"; +import {ChanType, SpecialChanType} from "../../../shared/types/chan"; export default function (irc, network) { const client = this; diff --git a/server/plugins/irc-events/message.ts b/server/plugins/irc-events/message.ts index 41afd41ed0..f148231255 100644 --- a/server/plugins/irc-events/message.ts +++ b/server/plugins/irc-events/message.ts @@ -3,9 +3,10 @@ import LinkPrefetch from "./link"; import {cleanIrcMessage} from "../../../shared/irc"; import Helper from "../../helper"; import {IrcEventHandler} from "../../client"; -import Chan, {ChanType} from "../../models/chan"; +import Chan from "../../models/chan"; import User from "../../models/user"; import {MessageType} from "../../../shared/types/msg"; +import {ChanType} from "../../../shared/types/chan"; const nickRegExp = /(?:\x03[0-9]{1,2}(?:,[0-9]{1,2})?)?([\w[\]\\`^{|}-]+)/g; diff --git a/server/plugins/irc-events/modelist.ts b/server/plugins/irc-events/modelist.ts index f91a093ba9..3f93799d90 100644 --- a/server/plugins/irc-events/modelist.ts +++ b/server/plugins/irc-events/modelist.ts @@ -1,8 +1,8 @@ import {IrcEventHandler} from "../../client"; -import {SpecialChanType, ChanType} from "../../models/chan"; import Msg from "../../models/msg"; import {MessageType} from "../../../shared/types/msg"; +import {SpecialChanType, ChanType} from "../../../shared/types/chan"; export default function (irc, network) { const client = this; diff --git a/server/plugins/irc-events/whois.ts b/server/plugins/irc-events/whois.ts index 97cdaacb0a..915c284b4d 100644 --- a/server/plugins/irc-events/whois.ts +++ b/server/plugins/irc-events/whois.ts @@ -1,8 +1,8 @@ import {IrcEventHandler} from "../../client"; -import {ChanType} from "../../models/chan"; import Msg from "../../models/msg"; import {MessageType} from "../../../shared/types/msg"; +import {ChanType} from "../../../shared/types/chan"; export default function (irc, network) { const client = this; diff --git a/server/server.ts b/server/server.ts index 562d16a7c6..61a9059529 100644 --- a/server/server.ts +++ b/server/server.ts @@ -24,7 +24,6 @@ themes.loadLocalThemes(); import packages from "./plugins/packages/index"; import {NetworkWithIrcFramework} from "./models/network"; -import {ChanType} from "./models/chan"; import Utils from "./command-line/utils"; import type { ClientToServerEvents, @@ -32,6 +31,7 @@ import type { InterServerEvents, SocketData, } from "../shared/types/socket-events"; +import {ChanType} from "../shared/types/chan"; type ServerOptions = { dev: boolean; From d0b71aba32ad9344c9f006dbfa155cb024d61d14 Mon Sep 17 00:00:00 2001 From: Reto Brunner Date: Sat, 24 Feb 2024 11:29:07 +0100 Subject: [PATCH 05/95] shared: extract chan + user --- client/js/types.d.ts | 8 ++++---- shared/types/chan.ts | 43 +++++++++++++++++++++++++++++++++++++++++++ shared/types/user.ts | 8 ++++++++ 3 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 shared/types/chan.ts create mode 100644 shared/types/user.ts diff --git a/client/js/types.d.ts b/client/js/types.d.ts index c58557b620..a36a0d161c 100644 --- a/client/js/types.d.ts +++ b/client/js/types.d.ts @@ -1,9 +1,9 @@ import {defineComponent} from "vue"; -import Chan from "../../server/models/chan"; import Network from "../../server/models/network"; -import User from "../../server/models/user"; import SharedMessage from "../../shared/types/msg"; +import SharedChan from "../../shared/types/chan"; +import SharedUser from "../../shared/models/user"; import {Mention} from "../../server/client"; import {ClientConfiguration} from "../../server/server"; import {LinkPreview} from "../../server/plugins/irc-events/link"; @@ -16,7 +16,7 @@ interface LoungeWindow extends Window { }; } -type ClientUser = User & { +type ClientUser = SharedUser & { // }; @@ -25,7 +25,7 @@ type ClientMessage = Omit & { users: string[]; }; -type ClientChan = Omit & { +type ClientChan = Omit & { moreHistoryAvailable: boolean; editTopic: boolean; users: ClientUser[]; diff --git a/shared/types/chan.ts b/shared/types/chan.ts new file mode 100644 index 0000000000..0de5892f24 --- /dev/null +++ b/shared/types/chan.ts @@ -0,0 +1,43 @@ +import {SharedMsg} from "./msg"; +import {SharedUser} from "./user"; + +export enum ChanType { + CHANNEL = "channel", + LOBBY = "lobby", + QUERY = "query", + SPECIAL = "special", +} + +export enum SpecialChanType { + BANLIST = "list_bans", + INVITELIST = "list_invites", + CHANNELLIST = "list_channels", + IGNORELIST = "list_ignored", +} + +export enum ChanState { + PARTED = 0, + JOINED = 1, +} + +export type SharedChan = { + // TODO: don't force existence, figure out how to make TS infer it. + id: number; + messages: SharedMsg[]; + name: string; + key: string; + topic: string; + firstUnread: number; + unread: number; + highlight: number; + users: Map; + muted: boolean; + type: ChanType; + state: ChanState; + + userAway?: boolean; + special?: SpecialChanType; + data?: any; + closed?: boolean; + num_users?: number; +}; diff --git a/shared/types/user.ts b/shared/types/user.ts new file mode 100644 index 0000000000..7f689c24b9 --- /dev/null +++ b/shared/types/user.ts @@ -0,0 +1,8 @@ +export type SharedUser = { + modes: string[]; + // Users in the channel have only one mode assigned + mode: string; + away: string; + nick: string; + lastMessage: number; +}; From d716402da2719c4dcc3f2c6fa351f4a4554ec19e Mon Sep 17 00:00:00 2001 From: Reto Brunner Date: Sat, 24 Feb 2024 13:28:55 +0100 Subject: [PATCH 06/95] mention --- client/js/types.d.ts | 10 +++++----- server/client.ts | 14 +++----------- shared/types/mention.ts | 10 ++++++++++ 3 files changed, 18 insertions(+), 16 deletions(-) create mode 100644 shared/types/mention.ts diff --git a/client/js/types.d.ts b/client/js/types.d.ts index a36a0d161c..219c04d875 100644 --- a/client/js/types.d.ts +++ b/client/js/types.d.ts @@ -1,10 +1,10 @@ import {defineComponent} from "vue"; import Network from "../../server/models/network"; -import SharedMessage from "../../shared/types/msg"; -import SharedChan from "../../shared/types/chan"; -import SharedUser from "../../shared/models/user"; -import {Mention} from "../../server/client"; +import {SharedMessage} from "../../shared/types/msg"; +import {SharedChan} from "../../shared/types/chan"; +import {SharedUser} from "../../shared/models/user"; +import {SharedMention} from "../../shared/models/mention"; import {ClientConfiguration} from "../../server/server"; import {LinkPreview} from "../../server/plugins/irc-events/link"; @@ -58,7 +58,7 @@ type NetChan = { }; type ClientConfiguration = ClientConfiguration; -type ClientMention = Mention & { +type ClientMention = SharedMention & { localetime: string; channel: NetChan | null; }; diff --git a/server/client.ts b/server/client.ts index d1034383ee..b7063e82c4 100644 --- a/server/client.ts +++ b/server/client.ts @@ -10,7 +10,8 @@ import Chan, {ChanConfig} from "./models/chan"; import Msg from "./models/msg"; import Config from "./config"; import {condensedTypes} from "../shared/irc"; -import {MessageType, UserInMessage} from "../shared/types/msg"; +import {MessageType} from "../shared/types/msg"; +import {SharedMention} from "../shared/types/mention"; import inputs from "./plugins/inputs"; import PublicClient from "./plugins/packages/publicClient"; @@ -85,15 +86,6 @@ export type UserConfig = { networks?: NetworkConfig[]; }; -export type Mention = { - chanId: number; - msgId: number; - type: MessageType; - time: Date; - text: string; - from: UserInMessage; -}; - class Client { awayMessage!: string; lastActiveChannel!: number; @@ -106,7 +98,7 @@ class Client { idChan!: number; name!: string; networks!: Network[]; - mentions!: Mention[]; + mentions!: SharedMention[]; manager!: ClientManager; messageStorage!: MessageStorage[]; highlightRegex!: RegExp | null; diff --git a/shared/types/mention.ts b/shared/types/mention.ts new file mode 100644 index 0000000000..57e5eda873 --- /dev/null +++ b/shared/types/mention.ts @@ -0,0 +1,10 @@ +import {MessageType, UserInMessage} from "./msg"; + +export type SharedMention = { + chanId: number; + msgId: number; + type: MessageType; + time: Date; + text: string; + from: UserInMessage; +}; From 12a0b0b6f97145eeb50cdc7f06614e7872609cbd Mon Sep 17 00:00:00 2001 From: Reto Brunner Date: Sat, 24 Feb 2024 14:03:05 +0100 Subject: [PATCH 07/95] network --- client/js/types.d.ts | 4 ++-- server/models/chan.ts | 16 +++++++--------- shared/types/network.ts | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 11 deletions(-) create mode 100644 shared/types/network.ts diff --git a/client/js/types.d.ts b/client/js/types.d.ts index 219c04d875..c1064e40e1 100644 --- a/client/js/types.d.ts +++ b/client/js/types.d.ts @@ -1,8 +1,8 @@ import {defineComponent} from "vue"; -import Network from "../../server/models/network"; import {SharedMessage} from "../../shared/types/msg"; import {SharedChan} from "../../shared/types/chan"; +import {SharedNetwork} from "../../shared/types/network"; import {SharedUser} from "../../shared/models/user"; import {SharedMention} from "../../shared/models/mention"; import {ClientConfiguration} from "../../server/server"; @@ -46,7 +46,7 @@ type InitClientChan = ClientChan & { }; // We omit channels so we can use ClientChan[] instead of Chan[] -type ClientNetwork = Omit & { +type ClientNetwork = Omit & { isJoinChannelShown: boolean; isCollapsed: boolean; channels: ClientChan[]; diff --git a/server/models/chan.ts b/server/models/chan.ts index d0decbdc1f..b630fe1427 100644 --- a/server/models/chan.ts +++ b/server/models/chan.ts @@ -9,12 +9,7 @@ import Network from "./network"; import Prefix from "./prefix"; import {MessageType} from "../../shared/types/msg"; import {ChanType, SpecialChanType, ChanState} from "../../shared/types/chan"; - -// eslint-disable-next-line no-use-before-define -export type FilteredChannel = Chan & { - users: []; - totalMessages: number; -}; +import {SharedNetworkChan} from "../../shared/types/network"; export type ChanConfig = { name: string; @@ -189,7 +184,10 @@ class Chan { * If true, channel is assumed active. * @param {int} lastMessage - Last message id seen by active client to avoid sending duplicates. */ - getFilteredClone(lastActiveChannel?: number | boolean, lastMessage?: number): FilteredChannel { + getFilteredClone( + lastActiveChannel?: number | boolean, + lastMessage?: number + ): SharedNetworkChan { return Object.keys(this).reduce((newChannel, prop) => { if (Chan.optionalProperties.includes(prop)) { if (this[prop] !== undefined || (Array.isArray(this[prop]) && this[prop].length)) { @@ -213,13 +211,13 @@ class Chan { newChannel[prop] = this[prop].slice(-messagesToSend); } - (newChannel as FilteredChannel).totalMessages = this[prop].length; + (newChannel as SharedNetworkChan).totalMessages = this[prop].length; } else { newChannel[prop] = this[prop]; } return newChannel; - }, {}) as FilteredChannel; + }, {}) as SharedNetworkChan; } writeUserLog(client: Client, msg: Msg) { this.messages.push(msg); diff --git a/shared/types/network.ts b/shared/types/network.ts new file mode 100644 index 0000000000..80b22b7acf --- /dev/null +++ b/shared/types/network.ts @@ -0,0 +1,37 @@ +import {SharedChan} from "./chan"; + +export type SharedPrefixObject = { + symbol: string; + mode: string; +}; + +export type SharedNetworkChan = SharedChan & { + users: []; // TODO: this thing appears useless + totalMessages: number; +}; + +export type SharedPrefix = { + prefix: SharedPrefixObject[]; + modeToSymbol: {[mode: string]: string}; + symbols: string[]; +}; + +export type SharedServerOptions = { + CHANTYPES: string[]; + PREFIX: SharedPrefix; + NETWORK: string; +}; + +export type SharedNetworkStatus = { + connected: boolean; + secure: boolean; +}; + +export type SharedNetwork = { + uuid: string; + name: string; + nick: string; + serverOptions: SharedServerOptions; + status: SharedNetworkStatus; + channels: SharedNetworkChan[]; +}; From f0ee3be6fb8b73ebdcc1dcfb818b82ecb79b82ca Mon Sep 17 00:00:00 2001 From: Reto Brunner Date: Sat, 24 Feb 2024 14:57:20 +0100 Subject: [PATCH 08/95] wip: config --- shared/types/config.ts | 53 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 shared/types/config.ts diff --git a/shared/types/config.ts b/shared/types/config.ts new file mode 100644 index 0000000000..649bea1891 --- /dev/null +++ b/shared/types/config.ts @@ -0,0 +1,53 @@ +const config_example = { + public: false, + lockNetwork: false, + useHexIp: false, + prefetch: true, + fileUpload: true, + ldapEnabled: false, + defaults: { + name: "test", + host: "irc.libera.chat", + port: 6697, + password: "", + tls: true, + rejectUnauthorized: true, + nick: "butler", + username: "", + realname: "", + join: "#thelounge-test", + leaveMessage: "", + sasl: "", + saslAccount: "", + saslPassword: "", + }, + isUpdateAvailable: false, + applicationServerKey: + "BHcIWSuK8Yt_1nkWqKFcSdLQtuLuZyfegdugXQa_UBv02dOZtDhwEJocb1h8bxOSzLgkNRAAArw8BC126rTuc5Q", + version: "4.4.2-rc.1", + gitCommit: "1f66dd2af", + themes: [ + { + displayName: "Default", + name: "default", + themeColor: null, + }, + { + displayName: "Gruvbox", + name: "thelounge-theme-gruvbox", + themeColor: "#282828", + }, + { + displayName: "Morning", + name: "morning", + themeColor: null, + }, + { + displayName: "Solarized", + name: "thelounge-theme-solarized", + themeColor: "#002b36", + }, + ], + defaultTheme: "default", + fileUploadMaxFileSize: 10485760, +}; From 383907c2b85c5417e4e5e64acbd276aca6845606 Mon Sep 17 00:00:00 2001 From: Reto Brunner Date: Sat, 24 Feb 2024 16:47:48 +0100 Subject: [PATCH 09/95] Use SharedTypes --- client/js/types.d.ts | 6 ------ shared/types/msg.ts | 5 +++++ shared/types/socket-events.d.ts | 17 ++++++++--------- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/client/js/types.d.ts b/client/js/types.d.ts index c1064e40e1..3489c41869 100644 --- a/client/js/types.d.ts +++ b/client/js/types.d.ts @@ -1,6 +1,5 @@ import {defineComponent} from "vue"; -import {SharedMessage} from "../../shared/types/msg"; import {SharedChan} from "../../shared/types/chan"; import {SharedNetwork} from "../../shared/types/network"; import {SharedUser} from "../../shared/models/user"; @@ -20,11 +19,6 @@ type ClientUser = SharedUser & { // }; -type ClientMessage = Omit & { - time: Date; - users: string[]; -}; - type ClientChan = Omit & { moreHistoryAvailable: boolean; editTopic: boolean; diff --git a/shared/types/msg.ts b/shared/types/msg.ts index 07ebfa20d8..7698d08d9f 100644 --- a/shared/types/msg.ts +++ b/shared/types/msg.ts @@ -96,3 +96,8 @@ export type SharedMsg = { statusmsgGroup?: string; params?: string[]; }; + +export type ClientMessage = Omit & { + time: Date; + users: string[]; +}; diff --git a/shared/types/socket-events.d.ts b/shared/types/socket-events.d.ts index 3c7df13019..7d5a5c980a 100644 --- a/shared/types/socket-events.d.ts +++ b/shared/types/socket-events.d.ts @@ -1,9 +1,8 @@ -import {ClientMessage, ClientNetwork, InitClientChan} from "../../client/js/types"; -import {Mention} from "../client"; -import {ChanState} from "../models/chan"; -import Msg from "../models/msg"; -import Network from "../models/network"; -import User from "../models/user"; +import {ClientNetwork, InitClientChan} from "../../client/js/types"; +import {SharedMention} from "../../shared/types/mention"; +import {ChanState} from "../../shared/types/chan"; +import {SharedMsg, ClientMessage} from "../../shared/types/msg"; +import {SharedUser} from "../../shared/types/user"; import {ChangelogData} from "../plugins/changelog"; import {LinkPreview} from "../plugins/irc-events/link"; import {ClientConfiguration} from "../server"; @@ -40,7 +39,7 @@ interface ServerToClientEvents { "sessions:list": (data: Session[]) => void; - "mentions:list": (data: Mention[]) => void; + "mentions:list": (data: SharedMention[]) => void; "setting:new": ({name: string, value: any}) => void; "setting:all": (settings: {[key: string]: any}) => void; @@ -49,7 +48,7 @@ interface ServerToClientEvents { "mute:changed": (response: {target: number; status: boolean}) => void; - names: (data: {id: number; users: User[]}) => void; + names: (data: {id: number; users: SharedUser[]}) => void; network: (data: {networks: ClientNetwork[]}) => void; "network:options": (data: {network: string; serverOptions: {[key: string]: any}}) => void; @@ -89,7 +88,7 @@ interface ServerToClientEvents { totalMessages, }: { chan: number; - messages: Msg[]; + messages: SharedMsg[]; totalMessages: number; }) => void; From 4d237600d5ee2c1639f275a66e7307337e93b93b Mon Sep 17 00:00:00 2001 From: Reto Brunner Date: Sat, 24 Feb 2024 16:50:25 +0100 Subject: [PATCH 10/95] changelog: don't type assert to a broken type The mandatory fields are unset, stop lying to the compiler --- server/plugins/changelog.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/server/plugins/changelog.ts b/server/plugins/changelog.ts index cc049a6840..731027acc5 100644 --- a/server/plugins/changelog.ts +++ b/server/plugins/changelog.ts @@ -28,15 +28,15 @@ export type ChangelogData = { packages?: boolean; }; -const versions = { +const versions: ChangelogData = { current: { + prerelease: false, version: `v${pkg.version}`, changelog: undefined, + url: "", // TODO: properly init }, expiresAt: -1, - latest: undefined, - packages: undefined, -} as ChangelogData; +}; async function fetch() { const time = Date.now(); From 7bc184b252d790b4a78db1cf0e05d8efd22b4bb6 Mon Sep 17 00:00:00 2001 From: Reto Brunner Date: Sat, 24 Feb 2024 16:53:41 +0100 Subject: [PATCH 11/95] changelog data type --- server/plugins/changelog.ts | 21 ++++----------------- shared/types/changelog.ts | 15 +++++++++++++++ shared/types/socket-events.d.ts | 4 ++-- 3 files changed, 21 insertions(+), 19 deletions(-) create mode 100644 shared/types/changelog.ts diff --git a/server/plugins/changelog.ts b/server/plugins/changelog.ts index 731027acc5..f095e2010d 100644 --- a/server/plugins/changelog.ts +++ b/server/plugins/changelog.ts @@ -4,6 +4,7 @@ import log from "../log"; import pkg from "../../package.json"; import ClientManager from "../clientManager"; import Config from "../config"; +import {SharedChangelogData} from "../../shared/types/changelog"; const TIME_TO_LIVE = 15 * 60 * 1000; // 15 minutes, in milliseconds @@ -12,23 +13,7 @@ export default { fetch, checkForUpdates, }; -export type ChangelogData = { - current: { - prerelease: boolean; - version: string; - changelog?: string; - url: string; - }; - expiresAt: number; - latest?: { - prerelease: boolean; - version: string; - url: string; - }; - packages?: boolean; -}; - -const versions: ChangelogData = { +const versions: SharedChangelogData = { current: { prerelease: false, version: `v${pkg.version}`, @@ -36,6 +21,8 @@ const versions: ChangelogData = { url: "", // TODO: properly init }, expiresAt: -1, + latest: undefined, + packages: undefined, }; async function fetch() { diff --git a/shared/types/changelog.ts b/shared/types/changelog.ts new file mode 100644 index 0000000000..43e6d66adf --- /dev/null +++ b/shared/types/changelog.ts @@ -0,0 +1,15 @@ +export type SharedChangelogData = { + current: { + prerelease: boolean; + version: string; + changelog?: string; + url: string; + }; + expiresAt: number; + latest?: { + prerelease: boolean; + version: string; + url: string; + }; + packages?: boolean; +}; diff --git a/shared/types/socket-events.d.ts b/shared/types/socket-events.d.ts index 7d5a5c980a..55df9be1f4 100644 --- a/shared/types/socket-events.d.ts +++ b/shared/types/socket-events.d.ts @@ -3,7 +3,7 @@ import {SharedMention} from "../../shared/types/mention"; import {ChanState} from "../../shared/types/chan"; import {SharedMsg, ClientMessage} from "../../shared/types/msg"; import {SharedUser} from "../../shared/types/user"; -import {ChangelogData} from "../plugins/changelog"; +import {SharedChangelogData} from "../../shared/types/changelog"; import {LinkPreview} from "../plugins/irc-events/link"; import {ClientConfiguration} from "../server"; @@ -23,7 +23,7 @@ interface ServerToClientEvents { "upload:auth": (token: string) => void; - changelog: (data: ChangelogData) => void; + changelog: (data: SharedChangelogData) => void; "changelog:newversion": () => void; "channel:state": (data: {chan: number; state: ChanState}) => void; From 8e6920af1d05973566ebe5ea45cfa3fa093b2b6a Mon Sep 17 00:00:00 2001 From: Reto Brunner Date: Thu, 29 Feb 2024 07:53:23 +0100 Subject: [PATCH 12/95] configuration --- client/js/socket-events/msg.ts | 3 +- client/js/store.ts | 14 ++--- client/js/types.d.ts | 3 +- server/config.ts | 2 +- server/server.ts | 105 ++++++++++++++++---------------- shared/types/config.ts | 101 +++++++++++++++--------------- shared/types/socket-events.d.ts | 4 +- 7 files changed, 112 insertions(+), 120 deletions(-) diff --git a/client/js/socket-events/msg.ts b/client/js/socket-events/msg.ts index 4bb5e7c4ea..d962a1ebea 100644 --- a/client/js/socket-events/msg.ts +++ b/client/js/socket-events/msg.ts @@ -3,7 +3,8 @@ import socket from "../socket"; import {cleanIrcMessage} from "../../../shared/irc"; import {store} from "../store"; import {switchToChannel} from "../router"; -import {ClientChan, ClientMention, ClientMessage, NetChan} from "../types"; +import {ClientChan, NetChan} from "../types"; +import {ClientMessage} from "../../../shared/types/msg"; let pop; diff --git a/client/js/store.ts b/client/js/store.ts index 8962bb46d1..218873270e 100644 --- a/client/js/store.ts +++ b/client/js/store.ts @@ -3,19 +3,13 @@ import {ActionContext, createStore, Store, useStore as baseUseStore} from "vuex"; import {createSettingsStore} from "./store-settings"; import storage from "./localStorage"; -import type { - ClientChan, - ClientConfiguration, - ClientNetwork, - InitClientChan, - NetChan, - ClientMessage, - ClientMention, -} from "./types"; +import type {ClientChan, ClientNetwork, InitClientChan, NetChan, ClientMention} from "./types"; import type {InjectionKey} from "vue"; import {SettingsState} from "./settings"; import {SearchQuery} from "../../shared/types/storage"; +import {ClientMessage} from "../../shared/types/msg"; +import {SharedConfiguration, LockedSharedConfiguration} from "../../shared/types/config"; const appName = document.title; @@ -59,7 +53,7 @@ export type State = { mentions: ClientMention[]; hasServiceWorker: boolean; pushNotificationState: string; - serverConfiguration: ClientConfiguration | null; + serverConfiguration: SharedConfiguration | LockedSharedConfiguration | null; sessions: ClientSession[]; sidebarOpen: boolean; sidebarDragging: boolean; diff --git a/client/js/types.d.ts b/client/js/types.d.ts index 3489c41869..9c94108650 100644 --- a/client/js/types.d.ts +++ b/client/js/types.d.ts @@ -4,7 +4,7 @@ import {SharedChan} from "../../shared/types/chan"; import {SharedNetwork} from "../../shared/types/network"; import {SharedUser} from "../../shared/models/user"; import {SharedMention} from "../../shared/models/mention"; -import {ClientConfiguration} from "../../server/server"; +import {SharedConfiguration, LockedSharedConfiguration} from "../../shared/types/config"; import {LinkPreview} from "../../server/plugins/irc-events/link"; interface LoungeWindow extends Window { @@ -51,7 +51,6 @@ type NetChan = { network: ClientNetwork; }; -type ClientConfiguration = ClientConfiguration; type ClientMention = SharedMention & { localetime: string; channel: NetChan | null; diff --git a/server/config.ts b/server/config.ts index bad5f5221e..bba3e334ca 100644 --- a/server/config.ts +++ b/server/config.ts @@ -44,7 +44,7 @@ export type Defaults = Pick< | "saslAccount" | "saslPassword" > & { - join?: string; + join: string; }; type Identd = { diff --git a/server/server.ts b/server/server.ts index 61a9059529..f925c9703c 100644 --- a/server/server.ts +++ b/server/server.ts @@ -32,6 +32,12 @@ import type { SocketData, } from "../shared/types/socket-events"; import {ChanType} from "../shared/types/chan"; +import { + LockedSharedConfiguration, + SharedConfiguration, + ConfigNetDefaults, + LockedConfigNetDefaults, +} from "../shared/types/config"; type ServerOptions = { dev: boolean; @@ -45,22 +51,6 @@ type IndexTemplateConfiguration = ServerConfiguration & { cacheBust: string; }; -export type ClientConfiguration = Pick< - ConfigType, - "public" | "lockNetwork" | "useHexIp" | "prefetch" | "defaults" -> & { - fileUpload: boolean; - ldapEnabled: boolean; - isUpdateAvailable: boolean; - applicationServerKey: string; - version: string; - gitCommit: string | null; - defaultTheme: string; - themes: ThemeForClient[]; - defaults: Defaults; - fileUploadMaxFileSize?: number; -}; - // A random number that will force clients to reload the page if it differs const serverHash = Math.floor(Date.now() * Math.random()); @@ -857,47 +847,58 @@ function initializeClient( } } -function getClientConfiguration(): ClientConfiguration { - const config = _.pick(Config.values, [ - "public", - "lockNetwork", - "useHexIp", - "prefetch", - ]) as ClientConfiguration; +function getClientConfiguration(): SharedConfiguration | LockedSharedConfiguration { + const common = { + fileUpload: Config.values.fileUpload.enable, + ldapEnabled: Config.values.ldap.enable, + isUpdateAvailable: changelog.isUpdateAvailable, + applicationServerKey: manager!.webPush.vapidKeys!.publicKey, + version: Helper.getVersionNumber(), + gitCommit: Helper.getGitCommit(), + themes: themes.getAll(), + defaultTheme: Config.values.theme, + public: Config.values.public, + useHexIp: Config.values.useHexIp, + prefetch: Config.values.prefetch, + fileUploadMaxFileSize: Uploader ? Uploader.getMaxFileSize() : undefined, // TODO can't be undefined? + }; - config.fileUpload = Config.values.fileUpload.enable; - config.ldapEnabled = Config.values.ldap.enable; + const defaultsOverride = { + nick: Config.getDefaultNick(), // expand the number part - if (!config.lockNetwork) { - config.defaults = _.clone(Config.values.defaults); - } else { - // Only send defaults that are visible on the client - config.defaults = _.pick(Config.values.defaults, [ - "name", - "nick", - "username", - "password", - "realname", - "join", - ]) as Defaults; - } + // TODO: this doesn't seem right, if the client needs this as a buffer + // the client ought to add it on its own + sasl: "", + saslAccount: "", + saslPassword: "", + }; - config.isUpdateAvailable = changelog.isUpdateAvailable; - config.applicationServerKey = manager!.webPush.vapidKeys!.publicKey; - config.version = Helper.getVersionNumber(); - config.gitCommit = Helper.getGitCommit(); - config.themes = themes.getAll(); - config.defaultTheme = Config.values.theme; - config.defaults.nick = Config.getDefaultNick(); - config.defaults.sasl = ""; - config.defaults.saslAccount = ""; - config.defaults.saslPassword = ""; - - if (Uploader) { - config.fileUploadMaxFileSize = Uploader.getMaxFileSize(); + if (!Config.values.lockNetwork) { + const defaults: ConfigNetDefaults = { + ..._.clone(Config.values.defaults), + ...defaultsOverride, + }; + const result: SharedConfiguration = { + ...common, + defaults: defaults, + lockNetwork: Config.values.lockNetwork, + }; + return result; } - return config; + // Only send defaults that are visible on the client + const defaults: LockedConfigNetDefaults = { + ..._.pick(Config.values.defaults, ["name", "username", "password", "realname", "join"]), + ...defaultsOverride, + }; + + const result: LockedSharedConfiguration = { + ...common, + lockNetwork: Config.values.lockNetwork, + defaults: defaults, + }; + + return result; } function getServerConfiguration(): ServerConfiguration { diff --git a/shared/types/config.ts b/shared/types/config.ts index 649bea1891..4b7919eee0 100644 --- a/shared/types/config.ts +++ b/shared/types/config.ts @@ -1,53 +1,50 @@ -const config_example = { - public: false, - lockNetwork: false, - useHexIp: false, - prefetch: true, - fileUpload: true, - ldapEnabled: false, - defaults: { - name: "test", - host: "irc.libera.chat", - port: 6697, - password: "", - tls: true, - rejectUnauthorized: true, - nick: "butler", - username: "", - realname: "", - join: "#thelounge-test", - leaveMessage: "", - sasl: "", - saslAccount: "", - saslPassword: "", - }, - isUpdateAvailable: false, - applicationServerKey: - "BHcIWSuK8Yt_1nkWqKFcSdLQtuLuZyfegdugXQa_UBv02dOZtDhwEJocb1h8bxOSzLgkNRAAArw8BC126rTuc5Q", - version: "4.4.2-rc.1", - gitCommit: "1f66dd2af", - themes: [ - { - displayName: "Default", - name: "default", - themeColor: null, - }, - { - displayName: "Gruvbox", - name: "thelounge-theme-gruvbox", - themeColor: "#282828", - }, - { - displayName: "Morning", - name: "morning", - themeColor: null, - }, - { - displayName: "Solarized", - name: "thelounge-theme-solarized", - themeColor: "#002b36", - }, - ], - defaultTheme: "default", - fileUploadMaxFileSize: 10485760, +export type ConfigTheme = { + displayName: string; + name: string; + themeColor: string | null; +}; +type SharedConfigurationBase = { + public: boolean; + useHexIp: boolean; + prefetch: boolean; + fileUpload: boolean; + ldapEnabled: boolean; + isUpdateAvailable: boolean; + applicationServerKey: string; + version: string; + gitCommit: string | null; + themes: ConfigTheme[]; + defaultTheme: string; + fileUploadMaxFileSize?: number; +}; + +export type ConfigNetDefaults = { + name: string; + host: string; + port: number; + password: string; + tls: boolean; + rejectUnauthorized: boolean; + nick: string; + username: string; + realname: string; + join: string; + leaveMessage: string; + sasl: string; + saslAccount: string; + saslPassword: string; +}; +export type LockedConfigNetDefaults = Pick< + ConfigNetDefaults, + "name" | "nick" | "username" | "password" | "realname" | "join" +>; + +export type LockedSharedConfiguration = SharedConfigurationBase & { + lockNetwork: true; + defaults: LockedConfigNetDefaults; +}; + +export type SharedConfiguration = SharedConfigurationBase & { + lockNetwork: false; + defaults: ConfigNetDefaults; }; diff --git a/shared/types/socket-events.d.ts b/shared/types/socket-events.d.ts index 55df9be1f4..6650011162 100644 --- a/shared/types/socket-events.d.ts +++ b/shared/types/socket-events.d.ts @@ -5,7 +5,7 @@ import {SharedMsg, ClientMessage} from "../../shared/types/msg"; import {SharedUser} from "../../shared/types/user"; import {SharedChangelogData} from "../../shared/types/changelog"; import {LinkPreview} from "../plugins/irc-events/link"; -import {ClientConfiguration} from "../server"; +import {SharedConfiguration, LockedSharedConfiguration} from "../../shared/types/config"; type Session = { current: boolean; @@ -32,7 +32,7 @@ interface ServerToClientEvents { commands: (data: string[]) => void; - configuration: (config: ClientConfiguration) => void; + configuration: (config: SharedConfiguration | LockedSharedConfiguration) => void; "push:issubscribed": (isSubscribed: boolean) => void; "push:unregister": () => void; From 7073584f1c1448fb699faffb4d9c9b366f373c00 Mon Sep 17 00:00:00 2001 From: Reto Brunner Date: Fri, 1 Mar 2024 08:19:48 +0100 Subject: [PATCH 13/95] fix msg event --- client/js/socket-events/msg.ts | 9 ++++++--- shared/types/msg.ts | 1 + 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/client/js/socket-events/msg.ts b/client/js/socket-events/msg.ts index d962a1ebea..0f0e187928 100644 --- a/client/js/socket-events/msg.ts +++ b/client/js/socket-events/msg.ts @@ -123,12 +123,14 @@ function notifyMessage( ) { let title: string; let body: string; + // TODO: fix msg type and get rid of that conditional + const nick = msg.from && msg.from.nick ? msg.from.nick : "unkonown"; if (msg.type === "invite") { title = "New channel invite:"; - body = msg.from.nick + " invited you to " + msg.channel; + body = nick + " invited you to " + msg.channel; } else { - title = String(msg.from.nick); + title = nick; if (channel.type !== "query") { title += ` (${channel.name})`; @@ -138,7 +140,8 @@ function notifyMessage( title += " says:"; } - body = cleanIrcMessage(msg.text); + // TODO: fix msg type and get rid of that conditional + body = cleanIrcMessage(msg.text ? msg.text : ""); } const timestamp = Date.parse(String(msg.time)); diff --git a/shared/types/msg.ts b/shared/types/msg.ts index 7698d08d9f..a0fc41be18 100644 --- a/shared/types/msg.ts +++ b/shared/types/msg.ts @@ -100,4 +100,5 @@ export type SharedMsg = { export type ClientMessage = Omit & { time: Date; users: string[]; + id: number; }; From 88c8830a17fc6f7526b116ac6f7760291ec84026 Mon Sep 17 00:00:00 2001 From: Reto Brunner Date: Fri, 1 Mar 2024 09:04:30 +0100 Subject: [PATCH 14/95] chatuserlist --- client/components/ChatUserList.vue | 4 ++-- client/js/socket-events/more.ts | 7 +++++-- client/js/types.d.ts | 4 +--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/client/components/ChatUserList.vue b/client/components/ChatUserList.vue index ec3c971bc3..ffd5fb3973 100644 --- a/client/components/ChatUserList.vue +++ b/client/components/ChatUserList.vue @@ -59,7 +59,7 @@