fix: align discord config ui
This commit is contained in:
@@ -26,6 +26,7 @@
|
|||||||
- Signal: add `signal-cli` JSON-RPC support for send/receive via the Signal provider.
|
- Signal: add `signal-cli` JSON-RPC support for send/receive via the Signal provider.
|
||||||
- iMessage: add imsg JSON-RPC integration (stdio), chat_id routing, and group chat support.
|
- iMessage: add imsg JSON-RPC integration (stdio), chat_id routing, and group chat support.
|
||||||
- Chat UI: add recent-session dropdown switcher (main first) in macOS/iOS/Android + Control UI.
|
- Chat UI: add recent-session dropdown switcher (main first) in macOS/iOS/Android + Control UI.
|
||||||
|
- UI: add Discord/Signal/iMessage connection panels in macOS + Control UI (thanks @thewilloftheshadow).
|
||||||
- Discord: allow agent-triggered reactions via `clawdis_discord` when enabled, and surface message ids in context.
|
- Discord: allow agent-triggered reactions via `clawdis_discord` when enabled, and surface message ids in context.
|
||||||
- Discord: revamp guild routing config with per-guild/channel rules and slugged display names; add optional group DM support (default off).
|
- Discord: revamp guild routing config with per-guild/channel rules and slugged display names; add optional group DM support (default off).
|
||||||
- Discord: remove legacy guild/channel ignore lists in favor of per-guild allowlists (and proposed per-guild ignore lists).
|
- Discord: remove legacy guild/channel ignore lists in favor of per-guild allowlists (and proposed per-guild ignore lists).
|
||||||
|
|||||||
@@ -263,6 +263,12 @@ struct ConnectionsSettings: View {
|
|||||||
Divider().padding(.vertical, 2)
|
Divider().padding(.vertical, 2)
|
||||||
|
|
||||||
Grid(alignment: .leadingFirstTextBaseline, horizontalSpacing: 14, verticalSpacing: 10) {
|
Grid(alignment: .leadingFirstTextBaseline, horizontalSpacing: 14, verticalSpacing: 10) {
|
||||||
|
GridRow {
|
||||||
|
self.gridLabel("Enabled")
|
||||||
|
Toggle("", isOn: self.$store.discordEnabled)
|
||||||
|
.labelsHidden()
|
||||||
|
.toggleStyle(.checkbox)
|
||||||
|
}
|
||||||
GridRow {
|
GridRow {
|
||||||
self.gridLabel("Bot token")
|
self.gridLabel("Bot token")
|
||||||
if self.showDiscordToken {
|
if self.showDiscordToken {
|
||||||
@@ -279,24 +285,19 @@ struct ConnectionsSettings: View {
|
|||||||
.disabled(self.isDiscordTokenLocked)
|
.disabled(self.isDiscordTokenLocked)
|
||||||
}
|
}
|
||||||
GridRow {
|
GridRow {
|
||||||
self.gridLabel("Require mention")
|
self.gridLabel("Allow DMs from")
|
||||||
Toggle("", isOn: self.$store.discordRequireMention)
|
TextField("123456789, username#1234", text: self.$store.discordAllowFrom)
|
||||||
|
.textFieldStyle(.roundedBorder)
|
||||||
|
}
|
||||||
|
GridRow {
|
||||||
|
self.gridLabel("Group DMs")
|
||||||
|
Toggle("", isOn: self.$store.discordGroupEnabled)
|
||||||
.labelsHidden()
|
.labelsHidden()
|
||||||
.toggleStyle(.checkbox)
|
.toggleStyle(.checkbox)
|
||||||
}
|
}
|
||||||
GridRow {
|
GridRow {
|
||||||
self.gridLabel("Allow from")
|
self.gridLabel("Group channels")
|
||||||
TextField("discord:123, user:456", text: self.$store.discordAllowFrom)
|
TextField("channelId1, channelId2", text: self.$store.discordGroupChannels)
|
||||||
.textFieldStyle(.roundedBorder)
|
|
||||||
}
|
|
||||||
GridRow {
|
|
||||||
self.gridLabel("Allow guilds")
|
|
||||||
TextField("guildId1, guildId2", text: self.$store.discordGuildAllowFrom)
|
|
||||||
.textFieldStyle(.roundedBorder)
|
|
||||||
}
|
|
||||||
GridRow {
|
|
||||||
self.gridLabel("Allow guild users")
|
|
||||||
TextField("userId1, userId2", text: self.$store.discordGuildUsersAllowFrom)
|
|
||||||
.textFieldStyle(.roundedBorder)
|
.textFieldStyle(.roundedBorder)
|
||||||
}
|
}
|
||||||
GridRow {
|
GridRow {
|
||||||
@@ -304,6 +305,39 @@ struct ConnectionsSettings: View {
|
|||||||
TextField("8", text: self.$store.discordMediaMaxMb)
|
TextField("8", text: self.$store.discordMediaMaxMb)
|
||||||
.textFieldStyle(.roundedBorder)
|
.textFieldStyle(.roundedBorder)
|
||||||
}
|
}
|
||||||
|
GridRow {
|
||||||
|
self.gridLabel("History limit")
|
||||||
|
TextField("20", text: self.$store.discordHistoryLimit)
|
||||||
|
.textFieldStyle(.roundedBorder)
|
||||||
|
}
|
||||||
|
GridRow {
|
||||||
|
self.gridLabel("Reactions")
|
||||||
|
Toggle("", isOn: self.$store.discordEnableReactions)
|
||||||
|
.labelsHidden()
|
||||||
|
.toggleStyle(.checkbox)
|
||||||
|
}
|
||||||
|
GridRow {
|
||||||
|
self.gridLabel("Slash command")
|
||||||
|
Toggle("", isOn: self.$store.discordSlashEnabled)
|
||||||
|
.labelsHidden()
|
||||||
|
.toggleStyle(.checkbox)
|
||||||
|
}
|
||||||
|
GridRow {
|
||||||
|
self.gridLabel("Slash name")
|
||||||
|
TextField("clawd", text: self.$store.discordSlashName)
|
||||||
|
.textFieldStyle(.roundedBorder)
|
||||||
|
}
|
||||||
|
GridRow {
|
||||||
|
self.gridLabel("Slash session prefix")
|
||||||
|
TextField("discord:slash", text: self.$store.discordSlashSessionPrefix)
|
||||||
|
.textFieldStyle(.roundedBorder)
|
||||||
|
}
|
||||||
|
GridRow {
|
||||||
|
self.gridLabel("Slash ephemeral")
|
||||||
|
Toggle("", isOn: self.$store.discordSlashEphemeral)
|
||||||
|
.labelsHidden()
|
||||||
|
.toggleStyle(.checkbox)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.isDiscordTokenLocked {
|
if self.isDiscordTokenLocked {
|
||||||
|
|||||||
@@ -167,12 +167,18 @@ final class ConnectionsStore {
|
|||||||
var telegramWebhookSecret: String = ""
|
var telegramWebhookSecret: String = ""
|
||||||
var telegramWebhookPath: String = ""
|
var telegramWebhookPath: String = ""
|
||||||
var telegramBusy = false
|
var telegramBusy = false
|
||||||
|
var discordEnabled = true
|
||||||
var discordToken: String = ""
|
var discordToken: String = ""
|
||||||
var discordRequireMention = true
|
|
||||||
var discordAllowFrom: String = ""
|
var discordAllowFrom: String = ""
|
||||||
var discordGuildAllowFrom: String = ""
|
var discordGroupEnabled = false
|
||||||
var discordGuildUsersAllowFrom: String = ""
|
var discordGroupChannels: String = ""
|
||||||
var discordMediaMaxMb: String = ""
|
var discordMediaMaxMb: String = ""
|
||||||
|
var discordHistoryLimit: String = ""
|
||||||
|
var discordEnableReactions = true
|
||||||
|
var discordSlashEnabled = false
|
||||||
|
var discordSlashName: String = ""
|
||||||
|
var discordSlashSessionPrefix: String = ""
|
||||||
|
var discordSlashEphemeral = true
|
||||||
var signalEnabled = true
|
var signalEnabled = true
|
||||||
var signalAccount: String = ""
|
var signalAccount: String = ""
|
||||||
var signalHttpUrl: String = ""
|
var signalHttpUrl: String = ""
|
||||||
@@ -378,9 +384,10 @@ final class ConnectionsStore {
|
|||||||
self.telegramWebhookPath = telegram?["webhookPath"]?.stringValue ?? ""
|
self.telegramWebhookPath = telegram?["webhookPath"]?.stringValue ?? ""
|
||||||
|
|
||||||
let discord = snap.config?["discord"]?.dictionaryValue
|
let discord = snap.config?["discord"]?.dictionaryValue
|
||||||
|
self.discordEnabled = discord?["enabled"]?.boolValue ?? true
|
||||||
self.discordToken = discord?["token"]?.stringValue ?? ""
|
self.discordToken = discord?["token"]?.stringValue ?? ""
|
||||||
self.discordRequireMention = discord?["requireMention"]?.boolValue ?? true
|
let discordDm = discord?["dm"]?.dictionaryValue
|
||||||
if let allow = discord?["allowFrom"]?.arrayValue {
|
if let allow = discordDm?["allowFrom"]?.arrayValue {
|
||||||
let strings = allow.compactMap { entry -> String? in
|
let strings = allow.compactMap { entry -> String? in
|
||||||
if let str = entry.stringValue { return str }
|
if let str = entry.stringValue { return str }
|
||||||
if let intVal = entry.intValue { return String(intVal) }
|
if let intVal = entry.intValue { return String(intVal) }
|
||||||
@@ -391,38 +398,34 @@ final class ConnectionsStore {
|
|||||||
} else {
|
} else {
|
||||||
self.discordAllowFrom = ""
|
self.discordAllowFrom = ""
|
||||||
}
|
}
|
||||||
if let guildAllow = discord?["guildAllowFrom"]?.dictionaryValue {
|
self.discordGroupEnabled = discordDm?["groupEnabled"]?.boolValue ?? false
|
||||||
if let guilds = guildAllow["guilds"]?.arrayValue {
|
if let channels = discordDm?["groupChannels"]?.arrayValue {
|
||||||
let strings = guilds.compactMap { entry -> String? in
|
let strings = channels.compactMap { entry -> String? in
|
||||||
if let str = entry.stringValue { return str }
|
if let str = entry.stringValue { return str }
|
||||||
if let intVal = entry.intValue { return String(intVal) }
|
if let intVal = entry.intValue { return String(intVal) }
|
||||||
if let doubleVal = entry.doubleValue { return String(Int(doubleVal)) }
|
if let doubleVal = entry.doubleValue { return String(Int(doubleVal)) }
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
self.discordGuildAllowFrom = strings.joined(separator: ", ")
|
self.discordGroupChannels = strings.joined(separator: ", ")
|
||||||
} else {
|
} else {
|
||||||
self.discordGuildAllowFrom = ""
|
self.discordGroupChannels = ""
|
||||||
}
|
|
||||||
if let users = guildAllow["users"]?.arrayValue {
|
|
||||||
let strings = users.compactMap { entry -> String? in
|
|
||||||
if let str = entry.stringValue { return str }
|
|
||||||
if let intVal = entry.intValue { return String(intVal) }
|
|
||||||
if let doubleVal = entry.doubleValue { return String(Int(doubleVal)) }
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
self.discordGuildUsersAllowFrom = strings.joined(separator: ", ")
|
|
||||||
} else {
|
|
||||||
self.discordGuildUsersAllowFrom = ""
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
self.discordGuildAllowFrom = ""
|
|
||||||
self.discordGuildUsersAllowFrom = ""
|
|
||||||
}
|
}
|
||||||
if let media = discord?["mediaMaxMb"]?.doubleValue ?? discord?["mediaMaxMb"]?.intValue.map(Double.init) {
|
if let media = discord?["mediaMaxMb"]?.doubleValue ?? discord?["mediaMaxMb"]?.intValue.map(Double.init) {
|
||||||
self.discordMediaMaxMb = String(Int(media))
|
self.discordMediaMaxMb = String(Int(media))
|
||||||
} else {
|
} else {
|
||||||
self.discordMediaMaxMb = ""
|
self.discordMediaMaxMb = ""
|
||||||
}
|
}
|
||||||
|
if let history = discord?["historyLimit"]?.doubleValue ?? discord?["historyLimit"]?.intValue.map(Double.init) {
|
||||||
|
self.discordHistoryLimit = String(Int(history))
|
||||||
|
} else {
|
||||||
|
self.discordHistoryLimit = ""
|
||||||
|
}
|
||||||
|
self.discordEnableReactions = discord?["enableReactions"]?.boolValue ?? true
|
||||||
|
let slash = discord?["slashCommand"]?.dictionaryValue
|
||||||
|
self.discordSlashEnabled = slash?["enabled"]?.boolValue ?? false
|
||||||
|
self.discordSlashName = slash?["name"]?.stringValue ?? ""
|
||||||
|
self.discordSlashSessionPrefix = slash?["sessionPrefix"]?.stringValue ?? ""
|
||||||
|
self.discordSlashEphemeral = slash?["ephemeral"]?.boolValue ?? true
|
||||||
|
|
||||||
let signal = snap.config?["signal"]?.dictionaryValue
|
let signal = snap.config?["signal"]?.dictionaryValue
|
||||||
self.signalEnabled = signal?["enabled"]?.boolValue ?? true
|
self.signalEnabled = signal?["enabled"]?.boolValue ?? true
|
||||||
@@ -580,6 +583,11 @@ final class ConnectionsStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var discord: [String: Any] = (self.configRoot["discord"] as? [String: Any]) ?? [:]
|
var discord: [String: Any] = (self.configRoot["discord"] as? [String: Any]) ?? [:]
|
||||||
|
if self.discordEnabled {
|
||||||
|
discord.removeValue(forKey: "enabled")
|
||||||
|
} else {
|
||||||
|
discord["enabled"] = false
|
||||||
|
}
|
||||||
let token = self.discordToken.trimmingCharacters(in: .whitespacesAndNewlines)
|
let token = self.discordToken.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||||
if token.isEmpty {
|
if token.isEmpty {
|
||||||
discord.removeValue(forKey: "token")
|
discord.removeValue(forKey: "token")
|
||||||
@@ -587,43 +595,37 @@ final class ConnectionsStore {
|
|||||||
discord["token"] = token
|
discord["token"] = token
|
||||||
}
|
}
|
||||||
|
|
||||||
discord["requireMention"] = self.discordRequireMention
|
var dm: [String: Any] = (discord["dm"] as? [String: Any]) ?? [:]
|
||||||
|
|
||||||
let allow = self.discordAllowFrom
|
let allow = self.discordAllowFrom
|
||||||
.split(separator: ",")
|
.split(separator: ",")
|
||||||
.map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
|
.map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
|
||||||
.filter { !$0.isEmpty }
|
.filter { !$0.isEmpty }
|
||||||
if allow.isEmpty {
|
if allow.isEmpty {
|
||||||
discord.removeValue(forKey: "allowFrom")
|
dm.removeValue(forKey: "allowFrom")
|
||||||
} else {
|
} else {
|
||||||
discord["allowFrom"] = allow
|
dm["allowFrom"] = allow
|
||||||
}
|
}
|
||||||
|
|
||||||
var guildAllow: [String: Any] = (discord["guildAllowFrom"] as? [String: Any]) ?? [:]
|
if self.discordGroupEnabled {
|
||||||
let guilds = self.discordGuildAllowFrom
|
dm["groupEnabled"] = true
|
||||||
|
} else {
|
||||||
|
dm.removeValue(forKey: "groupEnabled")
|
||||||
|
}
|
||||||
|
|
||||||
|
let groupChannels = self.discordGroupChannels
|
||||||
.split(separator: ",")
|
.split(separator: ",")
|
||||||
.map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
|
.map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
|
||||||
.filter { !$0.isEmpty }
|
.filter { !$0.isEmpty }
|
||||||
if guilds.isEmpty {
|
if groupChannels.isEmpty {
|
||||||
guildAllow.removeValue(forKey: "guilds")
|
dm.removeValue(forKey: "groupChannels")
|
||||||
} else {
|
} else {
|
||||||
guildAllow["guilds"] = guilds
|
dm["groupChannels"] = groupChannels
|
||||||
}
|
}
|
||||||
|
|
||||||
let users = self.discordGuildUsersAllowFrom
|
if dm.isEmpty {
|
||||||
.split(separator: ",")
|
discord.removeValue(forKey: "dm")
|
||||||
.map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
|
|
||||||
.filter { !$0.isEmpty }
|
|
||||||
if users.isEmpty {
|
|
||||||
guildAllow.removeValue(forKey: "users")
|
|
||||||
} else {
|
} else {
|
||||||
guildAllow["users"] = users
|
discord["dm"] = dm
|
||||||
}
|
|
||||||
|
|
||||||
if guildAllow.isEmpty {
|
|
||||||
discord.removeValue(forKey: "guildAllowFrom")
|
|
||||||
} else {
|
|
||||||
discord["guildAllowFrom"] = guildAllow
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let media = self.discordMediaMaxMb.trimmingCharacters(in: .whitespacesAndNewlines)
|
let media = self.discordMediaMaxMb.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||||
@@ -633,6 +635,50 @@ final class ConnectionsStore {
|
|||||||
discord["mediaMaxMb"] = value
|
discord["mediaMaxMb"] = value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let history = self.discordHistoryLimit.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||||
|
if history.isEmpty {
|
||||||
|
discord.removeValue(forKey: "historyLimit")
|
||||||
|
} else if let value = Int(history), value >= 0 {
|
||||||
|
discord["historyLimit"] = value
|
||||||
|
} else {
|
||||||
|
discord.removeValue(forKey: "historyLimit")
|
||||||
|
}
|
||||||
|
|
||||||
|
if self.discordEnableReactions {
|
||||||
|
discord.removeValue(forKey: "enableReactions")
|
||||||
|
} else {
|
||||||
|
discord["enableReactions"] = false
|
||||||
|
}
|
||||||
|
|
||||||
|
var slash: [String: Any] = (discord["slashCommand"] as? [String: Any]) ?? [:]
|
||||||
|
if self.discordSlashEnabled {
|
||||||
|
slash["enabled"] = true
|
||||||
|
} else {
|
||||||
|
slash.removeValue(forKey: "enabled")
|
||||||
|
}
|
||||||
|
let slashName = self.discordSlashName.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||||
|
if slashName.isEmpty {
|
||||||
|
slash.removeValue(forKey: "name")
|
||||||
|
} else {
|
||||||
|
slash["name"] = slashName
|
||||||
|
}
|
||||||
|
let slashPrefix = self.discordSlashSessionPrefix.trimmingCharacters(in: .whitespacesAndNewlines)
|
||||||
|
if slashPrefix.isEmpty {
|
||||||
|
slash.removeValue(forKey: "sessionPrefix")
|
||||||
|
} else {
|
||||||
|
slash["sessionPrefix"] = slashPrefix
|
||||||
|
}
|
||||||
|
if self.discordSlashEphemeral {
|
||||||
|
slash.removeValue(forKey: "ephemeral")
|
||||||
|
} else {
|
||||||
|
slash["ephemeral"] = false
|
||||||
|
}
|
||||||
|
if slash.isEmpty {
|
||||||
|
discord.removeValue(forKey: "slashCommand")
|
||||||
|
} else {
|
||||||
|
discord["slashCommand"] = slash
|
||||||
|
}
|
||||||
|
|
||||||
if discord.isEmpty {
|
if discord.isEmpty {
|
||||||
self.configRoot.removeValue(forKey: "discord")
|
self.configRoot.removeValue(forKey: "discord")
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -69,7 +69,8 @@ export type DiscordChannelConfigResolved = {
|
|||||||
function summarizeAllowList(list?: Array<string | number>) {
|
function summarizeAllowList(list?: Array<string | number>) {
|
||||||
if (!list || list.length === 0) return "any";
|
if (!list || list.length === 0) return "any";
|
||||||
const sample = list.slice(0, 4).map((entry) => String(entry));
|
const sample = list.slice(0, 4).map((entry) => String(entry));
|
||||||
const suffix = list.length > sample.length ? ` (+${list.length - sample.length})` : "";
|
const suffix =
|
||||||
|
list.length > sample.length ? ` (+${list.length - sample.length})` : "";
|
||||||
return `${sample.join(", ")}${suffix}`;
|
return `${sample.join(", ")}${suffix}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,7 +78,8 @@ function summarizeGuilds(entries?: Record<string, DiscordGuildEntryResolved>) {
|
|||||||
if (!entries || Object.keys(entries).length === 0) return "any";
|
if (!entries || Object.keys(entries).length === 0) return "any";
|
||||||
const keys = Object.keys(entries);
|
const keys = Object.keys(entries);
|
||||||
const sample = keys.slice(0, 4);
|
const sample = keys.slice(0, 4);
|
||||||
const suffix = keys.length > sample.length ? ` (+${keys.length - sample.length})` : "";
|
const suffix =
|
||||||
|
keys.length > sample.length ? ` (+${keys.length - sample.length})` : "";
|
||||||
return `${sample.join(", ")}${suffix}`;
|
return `${sample.join(", ")}${suffix}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2106,7 +2106,9 @@ export async function startGatewayServer(
|
|||||||
lastError: "disabled",
|
lastError: "disabled",
|
||||||
};
|
};
|
||||||
if (isVerbose()) {
|
if (isVerbose()) {
|
||||||
logTelegram.debug("telegram provider disabled (telegram.enabled=false)");
|
logTelegram.debug(
|
||||||
|
"telegram provider disabled (telegram.enabled=false)",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2121,7 +2123,9 @@ export async function startGatewayServer(
|
|||||||
};
|
};
|
||||||
// keep quiet by default; this is a normal state
|
// keep quiet by default; this is a normal state
|
||||||
if (isVerbose()) {
|
if (isVerbose()) {
|
||||||
logTelegram.debug("telegram provider not configured (no TELEGRAM_BOT_TOKEN)");
|
logTelegram.debug(
|
||||||
|
"telegram provider not configured (no TELEGRAM_BOT_TOKEN)",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2219,7 +2223,9 @@ export async function startGatewayServer(
|
|||||||
};
|
};
|
||||||
// keep quiet by default; this is a normal state
|
// keep quiet by default; this is a normal state
|
||||||
if (isVerbose()) {
|
if (isVerbose()) {
|
||||||
logDiscord.debug("discord provider not configured (no DISCORD_BOT_TOKEN)");
|
logDiscord.debug(
|
||||||
|
"discord provider not configured (no DISCORD_BOT_TOKEN)",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2411,7 +2417,9 @@ export async function startGatewayServer(
|
|||||||
};
|
};
|
||||||
// keep quiet by default; this is a normal state
|
// keep quiet by default; this is a normal state
|
||||||
if (isVerbose()) {
|
if (isVerbose()) {
|
||||||
logIMessage.debug("imessage provider not configured (no imessage config)");
|
logIMessage.debug(
|
||||||
|
"imessage provider not configured (no imessage config)",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2422,7 +2430,9 @@ export async function startGatewayServer(
|
|||||||
lastError: "disabled",
|
lastError: "disabled",
|
||||||
};
|
};
|
||||||
if (isVerbose()) {
|
if (isVerbose()) {
|
||||||
logIMessage.debug("imessage provider disabled (imessage.enabled=false)");
|
logIMessage.debug(
|
||||||
|
"imessage provider disabled (imessage.enabled=false)",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -217,12 +217,17 @@ export async function saveDiscordConfig(state: ConnectionsState) {
|
|||||||
delete discord.mediaMaxMb;
|
delete discord.mediaMaxMb;
|
||||||
}
|
}
|
||||||
|
|
||||||
const historyLimit = Number(form.historyLimit);
|
const historyLimitRaw = form.historyLimit.trim();
|
||||||
|
if (historyLimitRaw.length === 0) {
|
||||||
|
delete discord.historyLimit;
|
||||||
|
} else {
|
||||||
|
const historyLimit = Number(historyLimitRaw);
|
||||||
if (Number.isFinite(historyLimit) && historyLimit >= 0) {
|
if (Number.isFinite(historyLimit) && historyLimit >= 0) {
|
||||||
discord.historyLimit = historyLimit;
|
discord.historyLimit = historyLimit;
|
||||||
} else {
|
} else {
|
||||||
delete discord.historyLimit;
|
delete discord.historyLimit;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (form.enableReactions) {
|
if (form.enableReactions) {
|
||||||
delete discord.enableReactions;
|
delete discord.enableReactions;
|
||||||
|
|||||||
Reference in New Issue
Block a user