mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-10-22 21:52:28 +00:00
core, ui: create all links with short links, config parameter to use large link data, use short link as address in user profile (#5991)
Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com>
This commit is contained in:
1 parent
c08a3e7c4a
commit
e3e9ae2ffd
46 files changed
+413
-323
No files matched your search
@@ -23,7 +23,7 @@ enum ChatCommand: ChatCmdProtocol {
|
||||
case apiMuteUser(userId: Int64)
|
||||
case apiUnmuteUser(userId: Int64)
|
||||
case apiDeleteUser(userId: Int64, delSMPQueues: Bool, viewPwd: String?)
|
||||
case startChat(mainApp: Bool, enableSndFiles: Bool)
|
||||
case startChat(mainApp: Bool, enableSndFiles: Bool, largeLinkData: Bool)
|
||||
case checkChatRunning
|
||||
case apiStopChat
|
||||
case apiActivateChat(restoreChat: Bool)
|
||||
@@ -76,7 +76,7 @@ enum ChatCommand: ChatCmdProtocol {
|
||||
case apiLeaveGroup(groupId: Int64)
|
||||
case apiListMembers(groupId: Int64)
|
||||
case apiUpdateGroupProfile(groupId: Int64, groupProfile: GroupProfile)
|
||||
case apiCreateGroupLink(groupId: Int64, memberRole: GroupMemberRole, short: Bool)
|
||||
case apiCreateGroupLink(groupId: Int64, memberRole: GroupMemberRole)
|
||||
case apiGroupLinkMemberRole(groupId: Int64, memberRole: GroupMemberRole)
|
||||
case apiDeleteGroupLink(groupId: Int64)
|
||||
case apiGetGroupLink(groupId: Int64)
|
||||
@@ -116,7 +116,7 @@ enum ChatCommand: ChatCmdProtocol {
|
||||
case apiGetGroupMemberCode(groupId: Int64, groupMemberId: Int64)
|
||||
case apiVerifyContact(contactId: Int64, connectionCode: String?)
|
||||
case apiVerifyGroupMember(groupId: Int64, groupMemberId: Int64, connectionCode: String?)
|
||||
case apiAddContact(userId: Int64, short: Bool, incognito: Bool)
|
||||
case apiAddContact(userId: Int64, incognito: Bool)
|
||||
case apiSetConnectionIncognito(connId: Int64, incognito: Bool)
|
||||
case apiChangeConnectionUser(connId: Int64, userId: Int64)
|
||||
case apiConnectPlan(userId: Int64, connLink: String)
|
||||
@@ -138,7 +138,7 @@ enum ChatCommand: ChatCmdProtocol {
|
||||
case apiSetConnectionAlias(connId: Int64, localAlias: String)
|
||||
case apiSetUserUIThemes(userId: Int64, themes: ThemeModeOverrides?)
|
||||
case apiSetChatUIThemes(chatId: String, themes: ThemeModeOverrides?)
|
||||
case apiCreateMyAddress(userId: Int64, short: Bool)
|
||||
case apiCreateMyAddress(userId: Int64)
|
||||
case apiDeleteMyAddress(userId: Int64)
|
||||
case apiShowMyAddress(userId: Int64)
|
||||
case apiAddMyAddressShortLink(userId: Int64)
|
||||
@@ -203,7 +203,7 @@ enum ChatCommand: ChatCmdProtocol {
|
||||
case let .apiMuteUser(userId): return "/_mute user \(userId)"
|
||||
case let .apiUnmuteUser(userId): return "/_unmute user \(userId)"
|
||||
case let .apiDeleteUser(userId, delSMPQueues, viewPwd): return "/_delete user \(userId) del_smp=\(onOff(delSMPQueues))\(maybePwd(viewPwd))"
|
||||
case let .startChat(mainApp, enableSndFiles): return "/_start main=\(onOff(mainApp)) snd_files=\(onOff(enableSndFiles))"
|
||||
case let .startChat(mainApp, enableSndFiles, largeLinkData): return "/_start main=\(onOff(mainApp)) snd_files=\(onOff(enableSndFiles)) large_link_data=\(onOff(largeLinkData))"
|
||||
case .checkChatRunning: return "/_check running"
|
||||
case .apiStopChat: return "/_stop"
|
||||
case let .apiActivateChat(restore): return "/_app activate restore=\(onOff(restore))"
|
||||
@@ -266,7 +266,7 @@ enum ChatCommand: ChatCmdProtocol {
|
||||
case let .apiLeaveGroup(groupId): return "/_leave #\(groupId)"
|
||||
case let .apiListMembers(groupId): return "/_members #\(groupId)"
|
||||
case let .apiUpdateGroupProfile(groupId, groupProfile): return "/_group_profile #\(groupId) \(encodeJSON(groupProfile))"
|
||||
case let .apiCreateGroupLink(groupId, memberRole, short): return "/_create link #\(groupId) \(memberRole) short=\(onOff(short))"
|
||||
case let .apiCreateGroupLink(groupId, memberRole): return "/_create link #\(groupId) \(memberRole)"
|
||||
case let .apiGroupLinkMemberRole(groupId, memberRole): return "/_set link role #\(groupId) \(memberRole)"
|
||||
case let .apiDeleteGroupLink(groupId): return "/_delete link #\(groupId)"
|
||||
case let .apiGetGroupLink(groupId): return "/_get link #\(groupId)"
|
||||
@@ -316,7 +316,7 @@ enum ChatCommand: ChatCmdProtocol {
|
||||
case let .apiVerifyContact(contactId, .none): return "/_verify code @\(contactId)"
|
||||
case let .apiVerifyGroupMember(groupId, groupMemberId, .some(connectionCode)): return "/_verify code #\(groupId) \(groupMemberId) \(connectionCode)"
|
||||
case let .apiVerifyGroupMember(groupId, groupMemberId, .none): return "/_verify code #\(groupId) \(groupMemberId)"
|
||||
case let .apiAddContact(userId, short, incognito): return "/_connect \(userId) short=\(onOff(short)) incognito=\(onOff(incognito))"
|
||||
case let .apiAddContact(userId, incognito): return "/_connect \(userId) incognito=\(onOff(incognito))"
|
||||
case let .apiSetConnectionIncognito(connId, incognito): return "/_set incognito :\(connId) \(onOff(incognito))"
|
||||
case let .apiChangeConnectionUser(connId, userId): return "/_set conn user :\(connId) \(userId)"
|
||||
case let .apiConnectPlan(userId, connLink): return "/_connect plan \(userId) \(connLink)"
|
||||
@@ -338,7 +338,7 @@ enum ChatCommand: ChatCmdProtocol {
|
||||
case let .apiSetConnectionAlias(connId, localAlias): return "/_set alias :\(connId) \(localAlias.trimmingCharacters(in: .whitespaces))"
|
||||
case let .apiSetUserUIThemes(userId, themes): return "/_set theme user \(userId) \(themes != nil ? encodeJSON(themes) : "")"
|
||||
case let .apiSetChatUIThemes(chatId, themes): return "/_set theme \(chatId) \(themes != nil ? encodeJSON(themes) : "")"
|
||||
case let .apiCreateMyAddress(userId, short): return "/_address \(userId) short=\(onOff(short))"
|
||||
case let .apiCreateMyAddress(userId): return "/_address \(userId)"
|
||||
case let .apiDeleteMyAddress(userId): return "/_delete_address \(userId)"
|
||||
case let .apiShowMyAddress(userId): return "/_show_address \(userId)"
|
||||
case let .apiAddMyAddressShortLink(userId): return "/_short_link_address \(userId)"
|
||||
|
||||
@@ -227,7 +227,7 @@ func apiDeleteUser(_ userId: Int64, _ delSMPQueues: Bool, viewPwd: String?) asyn
|
||||
}
|
||||
|
||||
func apiStartChat(ctrl: chat_ctrl? = nil) throws -> Bool {
|
||||
let r: ChatResponse0 = try chatSendCmdSync(.startChat(mainApp: true, enableSndFiles: true), ctrl: ctrl)
|
||||
let r: ChatResponse0 = try chatSendCmdSync(.startChat(mainApp: true, enableSndFiles: true, largeLinkData: false), ctrl: ctrl)
|
||||
switch r {
|
||||
case .chatStarted: return true
|
||||
case .chatRunning: return false
|
||||
@@ -874,8 +874,7 @@ func apiAddContact(incognito: Bool) async -> ((CreatedConnLink, PendingContactCo
|
||||
logger.error("apiAddContact: no current user")
|
||||
return (nil, nil)
|
||||
}
|
||||
let short = UserDefaults.standard.bool(forKey: DEFAULT_PRIVACY_SHORT_LINKS)
|
||||
let r: APIResult<ChatResponse1> = await chatApiSendCmd(.apiAddContact(userId: userId, short: short, incognito: incognito), bgTask: false)
|
||||
let r: APIResult<ChatResponse1> = await chatApiSendCmd(.apiAddContact(userId: userId, incognito: incognito), bgTask: false)
|
||||
if case let .result(.invitation(_, connLinkInv, connection)) = r { return ((connLinkInv, connection), nil) }
|
||||
let alert = connectionErrorAlert(r)
|
||||
return (nil, alert)
|
||||
@@ -1215,9 +1214,9 @@ func apiSetChatUIThemes(chatId: ChatId, themes: ThemeModeOverrides?) async -> Bo
|
||||
}
|
||||
|
||||
|
||||
func apiCreateUserAddress(short: Bool) async throws -> CreatedConnLink {
|
||||
func apiCreateUserAddress() async throws -> CreatedConnLink {
|
||||
let userId = try currentUserId("apiCreateUserAddress")
|
||||
let r: ChatResponse1 = try await chatSendCmd(.apiCreateMyAddress(userId: userId, short: short))
|
||||
let r: ChatResponse1 = try await chatSendCmd(.apiCreateMyAddress(userId: userId))
|
||||
if case let .userContactLinkCreated(_, connLink) = r { return connLink }
|
||||
throw r.unexpected
|
||||
}
|
||||
@@ -1770,8 +1769,7 @@ func apiUpdateGroup(_ groupId: Int64, _ groupProfile: GroupProfile) async throws
|
||||
}
|
||||
|
||||
func apiCreateGroupLink(_ groupId: Int64, memberRole: GroupMemberRole = .member) async throws -> GroupLink {
|
||||
let short = UserDefaults.standard.bool(forKey: DEFAULT_PRIVACY_SHORT_LINKS)
|
||||
let r: ChatResponse2 = try await chatSendCmd(.apiCreateGroupLink(groupId: groupId, memberRole: memberRole, short: short))
|
||||
let r: ChatResponse2 = try await chatSendCmd(.apiCreateGroupLink(groupId: groupId, memberRole: memberRole))
|
||||
if case let .groupLinkCreated(_, _, groupLink) = r { return groupLink }
|
||||
throw r.unexpected
|
||||
}
|
||||
|
||||
@@ -86,19 +86,17 @@ struct GroupLinkView: View {
|
||||
Label("Share link", systemImage: "square.and.arrow.up")
|
||||
}
|
||||
|
||||
if UserDefaults.standard.bool(forKey: DEFAULT_PRIVACY_SHORT_LINKS) {
|
||||
if groupLink.connLinkContact.connShortLink == nil {
|
||||
Button {
|
||||
addShortLink()
|
||||
} label: {
|
||||
Label("Add short link", systemImage: "plus")
|
||||
}
|
||||
} else if !groupLink.shortLinkDataSet {
|
||||
Button {
|
||||
addShortLink()
|
||||
} label: {
|
||||
Label("Share group profile via link", systemImage: "plus")
|
||||
}
|
||||
if groupLink.connLinkContact.connShortLink == nil {
|
||||
Button {
|
||||
addShortLink()
|
||||
} label: {
|
||||
Label("Add short link", systemImage: "plus")
|
||||
}
|
||||
} else if !groupLink.shortLinkDataSet {
|
||||
Button {
|
||||
addShortLink()
|
||||
} label: {
|
||||
Label("Share group profile via link", systemImage: "plus")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -77,10 +77,9 @@ struct CreateSimpleXAddress: View {
|
||||
progressIndicator = true
|
||||
Task {
|
||||
do {
|
||||
let short = false
|
||||
let connLinkContact = try await apiCreateUserAddress(short: short)
|
||||
let connLinkContact = try await apiCreateUserAddress()
|
||||
DispatchQueue.main.async {
|
||||
m.userAddress = UserContactLink(connLinkContact: connLinkContact, shortLinkDataSet: short)
|
||||
m.userAddress = UserContactLink(connLinkContact: connLinkContact, shortLinkDataSet: connLinkContact.connShortLink != nil)
|
||||
}
|
||||
await MainActor.run { progressIndicator = false }
|
||||
} catch let error {
|
||||
|
||||
@@ -20,7 +20,6 @@ struct PrivacySettings: View {
|
||||
@AppStorage(GROUP_DEFAULT_PRIVACY_ASK_TO_APPROVE_RELAYS, store: groupDefaults) private var askToApproveRelays = true
|
||||
@State private var simplexLinkMode = privacySimplexLinkModeDefault.get()
|
||||
@AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false
|
||||
@AppStorage(DEFAULT_PRIVACY_SHORT_LINKS) private var shortSimplexLinks = false
|
||||
@AppStorage(DEFAULT_PRIVACY_PROTECT_SCREEN) private var protectScreen = false
|
||||
@AppStorage(DEFAULT_PERFORM_LA) private var prefPerformLA = false
|
||||
@State private var currentLAMode = privacyLocalAuthModeDefault.get()
|
||||
@@ -101,11 +100,6 @@ struct PrivacySettings: View {
|
||||
.onChange(of: simplexLinkMode) { mode in
|
||||
privacySimplexLinkModeDefault.set(mode)
|
||||
}
|
||||
if developerTools {
|
||||
settingsRow("link.badge.plus", color: theme.colors.secondary) {
|
||||
Toggle("Use short links (BETA)", isOn: $shortSimplexLinks)
|
||||
}
|
||||
}
|
||||
} header: {
|
||||
Text("Chats")
|
||||
.foregroundColor(theme.colors.secondary)
|
||||
|
||||
@@ -32,7 +32,6 @@ let DEFAULT_PRIVACY_LINK_PREVIEWS = "privacyLinkPreviews" // deprecated, moved t
|
||||
let DEFAULT_PRIVACY_SIMPLEX_LINK_MODE = "privacySimplexLinkMode"
|
||||
let DEFAULT_PRIVACY_SHOW_CHAT_PREVIEWS = "privacyShowChatPreviews"
|
||||
let DEFAULT_PRIVACY_SAVE_LAST_DRAFT = "privacySaveLastDraft"
|
||||
let DEFAULT_PRIVACY_SHORT_LINKS = "privacyShortLinks"
|
||||
let DEFAULT_PRIVACY_PROTECT_SCREEN = "privacyProtectScreen"
|
||||
let DEFAULT_PRIVACY_DELIVERY_RECEIPTS_SET = "privacyDeliveryReceiptsSet"
|
||||
let DEFAULT_PRIVACY_MEDIA_BLUR_RADIUS = "privacyMediaBlurRadius"
|
||||
@@ -100,7 +99,6 @@ let appDefaults: [String: Any] = [
|
||||
DEFAULT_PRIVACY_SIMPLEX_LINK_MODE: SimpleXLinkMode.description.rawValue,
|
||||
DEFAULT_PRIVACY_SHOW_CHAT_PREVIEWS: true,
|
||||
DEFAULT_PRIVACY_SAVE_LAST_DRAFT: true,
|
||||
DEFAULT_PRIVACY_SHORT_LINKS: false,
|
||||
DEFAULT_PRIVACY_PROTECT_SCREEN: false,
|
||||
DEFAULT_PRIVACY_DELIVERY_RECEIPTS_SET: false,
|
||||
DEFAULT_PRIVACY_MEDIA_BLUR_RADIUS: 0,
|
||||
|
||||
@@ -153,12 +153,10 @@ struct UserAddressView: View {
|
||||
}
|
||||
}
|
||||
addressSettingsButton(userAddress)
|
||||
if UserDefaults.standard.bool(forKey: DEFAULT_PRIVACY_SHORT_LINKS) {
|
||||
if userAddress.connLinkContact.connShortLink == nil {
|
||||
addShortLinkButton()
|
||||
} else if !userAddress.shortLinkDataSet {
|
||||
addProfileToShortLinkButton()
|
||||
}
|
||||
if userAddress.connLinkContact.connShortLink == nil {
|
||||
addShortLinkButton()
|
||||
} else if !userAddress.shortLinkDataSet {
|
||||
addProfileToShortLinkButton()
|
||||
}
|
||||
} header: {
|
||||
ToggleShortLinkHeader(text: Text("For social media"), link: userAddress.connLinkContact, short: $showShortLink)
|
||||
@@ -200,10 +198,9 @@ struct UserAddressView: View {
|
||||
progressIndicator = true
|
||||
Task {
|
||||
do {
|
||||
let short = UserDefaults.standard.bool(forKey: DEFAULT_PRIVACY_SHORT_LINKS)
|
||||
let connLinkContact = try await apiCreateUserAddress(short: short)
|
||||
let connLinkContact = try await apiCreateUserAddress()
|
||||
DispatchQueue.main.async {
|
||||
chatModel.userAddress = UserContactLink(connLinkContact: connLinkContact, shortLinkDataSet: short)
|
||||
chatModel.userAddress = UserContactLink(connLinkContact: connLinkContact, shortLinkDataSet: connLinkContact.connShortLink != nil)
|
||||
alert = .shareOnCreate
|
||||
progressIndicator = false
|
||||
}
|
||||
|
||||
@@ -5551,9 +5551,6 @@ report reason */
|
||||
/* No comment provided by engineer. */
|
||||
"Use servers" = "Verwende Server";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use short links (BETA)" = "Kurze Links verwenden (BETA)";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use SimpleX Chat servers?" = "Verwenden Sie SimpleX-Chat-Server?";
|
||||
|
||||
|
||||
@@ -5551,9 +5551,6 @@ report reason */
|
||||
/* No comment provided by engineer. */
|
||||
"Use servers" = "Usar servidores";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use short links (BETA)" = "Usar enlaces cortos (BETA)";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use SimpleX Chat servers?" = "¿Usar servidores SimpleX Chat?";
|
||||
|
||||
|
||||
@@ -5551,9 +5551,6 @@ report reason */
|
||||
/* No comment provided by engineer. */
|
||||
"Use servers" = "Kiszolgálók használata";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use short links (BETA)" = "Rövid hivatkozások használata (béta)";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use SimpleX Chat servers?" = "SimpleX Chat kiszolgálók használata?";
|
||||
|
||||
|
||||
@@ -5551,9 +5551,6 @@ report reason */
|
||||
/* No comment provided by engineer. */
|
||||
"Use servers" = "Usa i server";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use short links (BETA)" = "Usa link brevi (BETA)";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use SimpleX Chat servers?" = "Usare i server di SimpleX Chat?";
|
||||
|
||||
|
||||
@@ -5551,9 +5551,6 @@ report reason */
|
||||
/* No comment provided by engineer. */
|
||||
"Use servers" = "Gebruik servers";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use short links (BETA)" = "Gebruik korte links (BETA)";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use SimpleX Chat servers?" = "SimpleX Chat servers gebruiken?";
|
||||
|
||||
|
||||
@@ -5551,9 +5551,6 @@ report reason */
|
||||
/* No comment provided by engineer. */
|
||||
"Use servers" = "Использовать серверы";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use short links (BETA)" = "Короткие ссылки (БЕТА)";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"Use SimpleX Chat servers?" = "Использовать серверы предосталенные SimpleX Chat?";
|
||||
|
||||
|
||||
+13
-17
@@ -107,7 +107,6 @@ class AppPreferences {
|
||||
val simplexLinkMode: SharedPreference<SimplexLinkMode> = mkSafeEnumPreference(SHARED_PREFS_PRIVACY_SIMPLEX_LINK_MODE, SimplexLinkMode.default)
|
||||
val privacyShowChatPreviews = mkBoolPreference(SHARED_PREFS_PRIVACY_SHOW_CHAT_PREVIEWS, true)
|
||||
val privacySaveLastDraft = mkBoolPreference(SHARED_PREFS_PRIVACY_SAVE_LAST_DRAFT, true)
|
||||
val privacyShortLinks = mkBoolPreference(SHARED_PREFS_PRIVACY_SHORT_LINKS, false)
|
||||
val privacyDeliveryReceiptsSet = mkBoolPreference(SHARED_PREFS_PRIVACY_DELIVERY_RECEIPTS_SET, false)
|
||||
val privacyEncryptLocalFiles = mkBoolPreference(SHARED_PREFS_PRIVACY_ENCRYPT_LOCAL_FILES, true)
|
||||
val privacyAskToApproveRelays = mkBoolPreference(SHARED_PREFS_PRIVACY_ASK_TO_APPROVE_RELAYS, true)
|
||||
@@ -370,7 +369,6 @@ class AppPreferences {
|
||||
private const val SHARED_PREFS_PRIVACY_SIMPLEX_LINK_MODE = "PrivacySimplexLinkMode"
|
||||
private const val SHARED_PREFS_PRIVACY_SHOW_CHAT_PREVIEWS = "PrivacyShowChatPreviews"
|
||||
private const val SHARED_PREFS_PRIVACY_SAVE_LAST_DRAFT = "PrivacySaveLastDraft"
|
||||
private const val SHARED_PREFS_PRIVACY_SHORT_LINKS = "PrivacyShortLinks"
|
||||
private const val SHARED_PREFS_PRIVACY_DELIVERY_RECEIPTS_SET = "PrivacyDeliveryReceiptsSet"
|
||||
private const val SHARED_PREFS_PRIVACY_ENCRYPT_LOCAL_FILES = "PrivacyEncryptLocalFiles"
|
||||
private const val SHARED_PREFS_PRIVACY_ASK_TO_APPROVE_RELAYS = "PrivacyAskToApproveRelays"
|
||||
@@ -795,7 +793,7 @@ object ChatController {
|
||||
}
|
||||
|
||||
suspend fun apiStartChat(ctrl: ChatCtrl? = null): Boolean {
|
||||
val r = sendCmd(null, CC.StartChat(mainApp = true), ctrl)
|
||||
val r = sendCmd(null, CC.StartChat(mainApp = true, largeLinkData = false), ctrl)
|
||||
when (r.result) {
|
||||
is CR.ChatStarted -> return true
|
||||
is CR.ChatRunning -> return false
|
||||
@@ -1295,8 +1293,7 @@ object ChatController {
|
||||
|
||||
suspend fun apiAddContact(rh: Long?, incognito: Boolean): Pair<Pair<CreatedConnLink, PendingContactConnection>?, (() -> Unit)?> {
|
||||
val userId = try { currentUserId("apiAddContact") } catch (e: Exception) { return null to null }
|
||||
val short = appPrefs.privacyShortLinks.get()
|
||||
val r = sendCmd(rh, CC.APIAddContact(userId, short = short, incognito = incognito))
|
||||
val r = sendCmd(rh, CC.APIAddContact(userId, incognito = incognito))
|
||||
return when {
|
||||
r is API.Result && r.res is CR.Invitation -> (r.res.connLinkInvitation to r.res.connection) to null
|
||||
!(networkErrorAlert(r)) -> null to { apiErrorAlert("apiAddContact", generalGetString(MR.strings.connection_error), r) }
|
||||
@@ -1539,9 +1536,9 @@ object ChatController {
|
||||
return false
|
||||
}
|
||||
|
||||
suspend fun apiCreateUserAddress(rh: Long?, short: Boolean): CreatedConnLink? {
|
||||
suspend fun apiCreateUserAddress(rh: Long?): CreatedConnLink? {
|
||||
val userId = kotlin.runCatching { currentUserId("apiCreateUserAddress") }.getOrElse { return null }
|
||||
val r = sendCmd(rh, CC.ApiCreateMyAddress(userId, short))
|
||||
val r = sendCmd(rh, CC.ApiCreateMyAddress(userId))
|
||||
if (r is API.Result && r.res is CR.UserContactLinkCreated) return r.res.connLinkContact
|
||||
if (!(networkErrorAlert(r))) {
|
||||
apiErrorAlert("apiCreateUserAddress", generalGetString(MR.strings.error_creating_address), r)
|
||||
@@ -1992,8 +1989,7 @@ object ChatController {
|
||||
}
|
||||
|
||||
suspend fun apiCreateGroupLink(rh: Long?, groupId: Long, memberRole: GroupMemberRole = GroupMemberRole.Member): Pair<CreatedConnLink, GroupMemberRole>? {
|
||||
val short = appPrefs.privacyShortLinks.get()
|
||||
val r = sendCmd(rh, CC.APICreateGroupLink(groupId, memberRole, short))
|
||||
val r = sendCmd(rh, CC.APICreateGroupLink(groupId, memberRole))
|
||||
if (r is API.Result && r.res is CR.GroupLinkCreated) return r.res.connLinkContact to r.res.memberRole
|
||||
if (!(networkErrorAlert(r))) {
|
||||
apiErrorAlert("apiCreateGroupLink", generalGetString(MR.strings.error_creating_link_for_group), r)
|
||||
@@ -3338,7 +3334,7 @@ sealed class CC {
|
||||
class ApiMuteUser(val userId: Long): CC()
|
||||
class ApiUnmuteUser(val userId: Long): CC()
|
||||
class ApiDeleteUser(val userId: Long, val delSMPQueues: Boolean, val viewPwd: String?): CC()
|
||||
class StartChat(val mainApp: Boolean): CC()
|
||||
class StartChat(val mainApp: Boolean, val largeLinkData: Boolean): CC()
|
||||
class CheckChatRunning: CC()
|
||||
class ApiStopChat: CC()
|
||||
@Serializable
|
||||
@@ -3383,7 +3379,7 @@ sealed class CC {
|
||||
class ApiLeaveGroup(val groupId: Long): CC()
|
||||
class ApiListMembers(val groupId: Long): CC()
|
||||
class ApiUpdateGroupProfile(val groupId: Long, val groupProfile: GroupProfile): CC()
|
||||
class APICreateGroupLink(val groupId: Long, val memberRole: GroupMemberRole, val short: Boolean): CC()
|
||||
class APICreateGroupLink(val groupId: Long, val memberRole: GroupMemberRole): CC()
|
||||
class APIGroupLinkMemberRole(val groupId: Long, val memberRole: GroupMemberRole): CC()
|
||||
class APIDeleteGroupLink(val groupId: Long): CC()
|
||||
class APIGetGroupLink(val groupId: Long): CC()
|
||||
@@ -3423,7 +3419,7 @@ sealed class CC {
|
||||
class APIGetGroupMemberCode(val groupId: Long, val groupMemberId: Long): CC()
|
||||
class APIVerifyContact(val contactId: Long, val connectionCode: String?): CC()
|
||||
class APIVerifyGroupMember(val groupId: Long, val groupMemberId: Long, val connectionCode: String?): CC()
|
||||
class APIAddContact(val userId: Long, val short: Boolean, val incognito: Boolean): CC()
|
||||
class APIAddContact(val userId: Long, val incognito: Boolean): CC()
|
||||
class ApiSetConnectionIncognito(val connId: Long, val incognito: Boolean): CC()
|
||||
class ApiChangeConnectionUser(val connId: Long, val userId: Long): CC()
|
||||
class APIConnectPlan(val userId: Long, val connLink: String): CC()
|
||||
@@ -3439,7 +3435,7 @@ sealed class CC {
|
||||
class ApiSetConnectionAlias(val connId: Long, val localAlias: String): CC()
|
||||
class ApiSetUserUIThemes(val userId: Long, val themes: ThemeModeOverrides?): CC()
|
||||
class ApiSetChatUIThemes(val chatId: String, val themes: ThemeModeOverrides?): CC()
|
||||
class ApiCreateMyAddress(val userId: Long, val short: Boolean): CC()
|
||||
class ApiCreateMyAddress(val userId: Long): CC()
|
||||
class ApiDeleteMyAddress(val userId: Long): CC()
|
||||
class ApiShowMyAddress(val userId: Long): CC()
|
||||
class ApiAddMyAddressShortLink(val userId: Long): CC()
|
||||
@@ -3509,7 +3505,7 @@ sealed class CC {
|
||||
is ApiMuteUser -> "/_mute user $userId"
|
||||
is ApiUnmuteUser -> "/_unmute user $userId"
|
||||
is ApiDeleteUser -> "/_delete user $userId del_smp=${onOff(delSMPQueues)}${maybePwd(viewPwd)}"
|
||||
is StartChat -> "/_start main=${onOff(mainApp)}"
|
||||
is StartChat -> "/_start main=${onOff(mainApp)} large_link_data=${onOff(largeLinkData)}"
|
||||
is CheckChatRunning -> "/_check running"
|
||||
is ApiStopChat -> "/_stop"
|
||||
is ApiSetAppFilePaths -> "/set file paths ${json.encodeToString(this)}"
|
||||
@@ -3572,7 +3568,7 @@ sealed class CC {
|
||||
is ApiLeaveGroup -> "/_leave #$groupId"
|
||||
is ApiListMembers -> "/_members #$groupId"
|
||||
is ApiUpdateGroupProfile -> "/_group_profile #$groupId ${json.encodeToString(groupProfile)}"
|
||||
is APICreateGroupLink -> "/_create link #$groupId ${memberRole.name.lowercase()} short=${onOff(short)}"
|
||||
is APICreateGroupLink -> "/_create link #$groupId ${memberRole.name.lowercase()}"
|
||||
is APIGroupLinkMemberRole -> "/_set link role #$groupId ${memberRole.name.lowercase()}"
|
||||
is APIDeleteGroupLink -> "/_delete link #$groupId"
|
||||
is APIGetGroupLink -> "/_get link #$groupId"
|
||||
@@ -3612,7 +3608,7 @@ sealed class CC {
|
||||
is APIGetGroupMemberCode -> "/_get code #$groupId $groupMemberId"
|
||||
is APIVerifyContact -> "/_verify code @$contactId" + if (connectionCode != null) " $connectionCode" else ""
|
||||
is APIVerifyGroupMember -> "/_verify code #$groupId $groupMemberId" + if (connectionCode != null) " $connectionCode" else ""
|
||||
is APIAddContact -> "/_connect $userId short=${onOff(short)} incognito=${onOff(incognito)}"
|
||||
is APIAddContact -> "/_connect $userId incognito=${onOff(incognito)}"
|
||||
is ApiSetConnectionIncognito -> "/_set incognito :$connId ${onOff(incognito)}"
|
||||
is ApiChangeConnectionUser -> "/_set conn user :$connId $userId"
|
||||
is APIConnectPlan -> "/_connect plan $userId $connLink"
|
||||
@@ -3628,7 +3624,7 @@ sealed class CC {
|
||||
is ApiSetConnectionAlias -> "/_set alias :$connId ${localAlias.trim()}"
|
||||
is ApiSetUserUIThemes -> "/_set theme user $userId ${if (themes != null) json.encodeToString(themes) else ""}"
|
||||
is ApiSetChatUIThemes -> "/_set theme $chatId ${if (themes != null) json.encodeToString(themes) else ""}"
|
||||
is ApiCreateMyAddress -> "/_address $userId short=${onOff(short)}"
|
||||
is ApiCreateMyAddress -> "/_address $userId"
|
||||
is ApiDeleteMyAddress -> "/_delete_address $userId"
|
||||
is ApiShowMyAddress -> "/_show_address $userId"
|
||||
is ApiAddMyAddressShortLink -> "/_short_link_address $userId"
|
||||
|
||||
+1
-1
@@ -196,7 +196,7 @@ fun GroupLinkLayout(
|
||||
)
|
||||
}
|
||||
}
|
||||
if (groupLink.connShortLink == null && appPreferences.privacyShortLinks.get()) {
|
||||
if (groupLink.connShortLink == null) {
|
||||
AddShortLinkButton(addShortLink)
|
||||
}
|
||||
}
|
||||
|
||||
-7
@@ -88,13 +88,6 @@ fun PrivacySettingsView(
|
||||
simplexLinkMode.set(it)
|
||||
chatModel.simplexLinkMode.value = it
|
||||
})
|
||||
if (appPrefs.developerTools.get()) {
|
||||
SettingsPreferenceItem(
|
||||
null,
|
||||
stringResource(MR.strings.privacy_short_links),
|
||||
chatModel.controller.appPrefs.privacyShortLinks
|
||||
)
|
||||
}
|
||||
}
|
||||
SectionDividerSpaced()
|
||||
|
||||
|
||||
+2
-3
@@ -63,8 +63,7 @@ fun UserAddressView(
|
||||
fun createAddress() {
|
||||
withBGApi {
|
||||
progressIndicator = true
|
||||
val short = appPreferences.privacyShortLinks.get()
|
||||
val connReqContact = chatModel.controller.apiCreateUserAddress(user.value?.remoteHostId, short = short)
|
||||
val connReqContact = chatModel.controller.apiCreateUserAddress(user.value?.remoteHostId)
|
||||
if (connReqContact != null) {
|
||||
chatModel.userAddress.value = UserContactLinkRec(connReqContact)
|
||||
|
||||
@@ -225,7 +224,7 @@ private fun UserAddressLayout(
|
||||
// ShareViaEmailButton { sendEmail(userAddress) }
|
||||
BusinessAddressToggle(autoAcceptState) { saveAas(autoAcceptState.value, autoAcceptStateSaved) }
|
||||
AddressSettingsButton(user, userAddress, shareViaProfile, setProfileAddress, saveAas)
|
||||
if (userAddress.connLinkContact.connShortLink == null && appPreferences.privacyShortLinks.get()) {
|
||||
if (userAddress.connLinkContact.connShortLink == null) {
|
||||
AddShortLinkButton(addShortLink)
|
||||
}
|
||||
|
||||
|
||||
@@ -2362,7 +2362,6 @@
|
||||
<string name="onboarding_conditions_private_chats_not_accessible">لا يمكن الوصول إلى الدردشات الخاصة والمجموعات وجهات اتصالك لمشغلي الخادم.</string>
|
||||
<string name="onboarding_conditions_by_using_you_agree">باستخدام SimpleX Chat، توافق على:\n- إرسال المحتوى القانوني فقط في المجموعات العامة.\n- احترام المستخدمين الآخرين – لا سبام.</string>
|
||||
<string name="onboarding_conditions_accept">اقبل</string>
|
||||
<string name="privacy_short_links">استخدم روابط قصيرة (تجريبي)</string>
|
||||
<string name="link_requires_newer_app_version_please_upgrade">يتطلب هذا الرابط إصدار تطبيق أحدث. يُرجى ترقية التطبيق أو اطلب من جهة اتصالك إرسال رابط متوافق.</string>
|
||||
<string name="full_link_button_text">رابط كامل</string>
|
||||
<string name="short_link_button_text">رابط قصير</string>
|
||||
|
||||
@@ -98,7 +98,6 @@
|
||||
<string name="simplex_link_mode_full">Full link</string>
|
||||
<string name="simplex_link_mode_browser">Via browser</string>
|
||||
<string name="simplex_link_mode_browser_warning">Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red.</string>
|
||||
<string name="privacy_short_links">Use short links (BETA)</string>
|
||||
|
||||
<!-- Reports - ChatModel.kt -->
|
||||
<string name="report_reason_spam">Spam</string>
|
||||
|
||||
@@ -2346,7 +2346,6 @@
|
||||
<string name="simplex_link_channel">Enllaç al canal SimpleX</string>
|
||||
<string name="link_requires_newer_app_version_please_upgrade">Aquest enllaç requereix una versió de l\'aplicació més recent. Actualitzeu l\'aplicació o demaneu al vostre contacte que enviï un enllaç compatible.</string>
|
||||
<string name="unsupported_connection_link">Enllaç de connexió no compatible</string>
|
||||
<string name="privacy_short_links">Emprar enllaços curts (BETA)</string>
|
||||
<string name="full_link_button_text">Enllaç complet</string>
|
||||
<string name="short_link_button_text">Enllaç curt</string>
|
||||
<string name="network_smp_web_port_all">Tots els servidors</string>
|
||||
|
||||
@@ -2371,7 +2371,6 @@
|
||||
<string name="onboarding_conditions_privacy_policy_and_conditions_of_use">Zásady ochrany soukromí a podmínky používání.</string>
|
||||
<string name="onboarding_conditions_private_chats_not_accessible">Soukromé konverzace, skupiny a kontakty nejsou přístupné provozovatelům serverů.</string>
|
||||
<string name="unsupported_connection_link">Nepodporovaný odkaz k připojení</string>
|
||||
<string name="privacy_short_links">Používejte krátké odkazy (BETA)</string>
|
||||
<string name="link_requires_newer_app_version_please_upgrade">Tento odkaz vyžaduje novější verzi aplikace. Prosím aktualizujte aplikaci nebo požádejte kontakt o odeslání kompatibilního odkazu.</string>
|
||||
<string name="simplex_link_channel">odkaz SimpleX kanálu</string>
|
||||
<string name="full_link_button_text">Úplný odkaz</string>
|
||||
|
||||
@@ -2453,7 +2453,6 @@
|
||||
<string name="onboarding_conditions_configure_server_operators">Server-Betreiber konfigurieren</string>
|
||||
<string name="onboarding_conditions_private_chats_not_accessible">Private Chats, Gruppen und Ihre Kontakte sind für Server-Betreiber nicht zugänglich.</string>
|
||||
<string name="unsupported_connection_link">Verbindungs-Link wird nicht unterstützt</string>
|
||||
<string name="privacy_short_links">Kurze Links verwenden (BETA)</string>
|
||||
<string name="short_link_button_text">Verkürzter Link</string>
|
||||
<string name="full_link_button_text">Vollständiger Link</string>
|
||||
<string name="simplex_link_channel">SimpleX-Kanal-Link</string>
|
||||
|
||||
@@ -2382,7 +2382,6 @@
|
||||
<string name="short_link_button_text">Enlace corto</string>
|
||||
<string name="link_requires_newer_app_version_please_upgrade">Este enlace requiere una versión más reciente de la aplicación. Por favor, actualiza la aplicación o pide a tu contacto un enlace compatible.</string>
|
||||
<string name="unsupported_connection_link">Enlace de conexión no compatible</string>
|
||||
<string name="privacy_short_links">Usar enlaces cortos (BETA)</string>
|
||||
<string name="network_smp_web_port_preset_footer">Usar puerto TCP 443 solo en servidores predefinidos.</string>
|
||||
<string name="network_smp_web_port_all">Todos los servidores</string>
|
||||
<string name="network_smp_web_port_preset">Servidores predefinidos</string>
|
||||
|
||||
@@ -2345,7 +2345,6 @@
|
||||
<string name="onboarding_conditions_private_chats_not_accessible">A privát csevegések, a csoportok és a partnerek nem érhetők el a szerver üzemeltetői számára.</string>
|
||||
<string name="onboarding_conditions_configure_server_operators">Kiszolgálóüzemeltetők beállítása</string>
|
||||
<string name="unsupported_connection_link">Nem támogatott kapcsolattartási hivatkozás</string>
|
||||
<string name="privacy_short_links">Rövid hivatkozások használata (béta)</string>
|
||||
<string name="short_link_button_text">Rövid hivatkozás</string>
|
||||
<string name="full_link_button_text">Teljes hivatkozás</string>
|
||||
<string name="link_requires_newer_app_version_please_upgrade">Ez a hivatkozás újabb alkalmazásverziót igényel. Frissítse az alkalmazást vagy kérjen egy kompatibilis hivatkozást a partnerétől.</string>
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
<string name="error_parsing_uri_desc">Periksa apakah tautan SimpleX sudah benar.</string>
|
||||
<string name="connected_to_server_to_receive_messages_from_contact">Anda terhubung ke server yang digunakan untuk menerima pesan dari kontak ini.</string>
|
||||
<string name="trying_to_connect_to_server_to_receive_messages_with_error">Mencoba menyambung ke server yang digunakan untuk menerima pesan dari kontak ini (error: %1$s).</string>
|
||||
<string name="database_migration_in_progress">Migrasi basis data sedang berlangsung,
|
||||
<string name="database_migration_in_progress">Migrasi basis data sedang berlangsung,
|
||||
\nmemerlukan waktu beberapa menit.</string>
|
||||
<string name="server_connecting">menghubungkan</string>
|
||||
<string name="non_content_uri_alert_title">Lokasi file tidak valid</string>
|
||||
@@ -2356,7 +2356,6 @@
|
||||
<string name="full_link_button_text">Tautan lengkap</string>
|
||||
<string name="link_requires_newer_app_version_please_upgrade">Tautan ini perlu versi aplikasi yang baru. Harap perbarui aplikasi atau minta kontak untuk kirim tautan kompatibel.</string>
|
||||
<string name="simplex_link_channel">Tautan saluran SimpleX</string>
|
||||
<string name="privacy_short_links">Gunakan tautan singkat (BETA)</string>
|
||||
<string name="unsupported_connection_link">Tautan koneksi tidak didukung</string>
|
||||
<string name="short_link_button_text">Tautan singkat</string>
|
||||
<string name="cant_send_message_generic">gagal mengirim pesan</string>
|
||||
|
||||
@@ -2386,7 +2386,6 @@
|
||||
<string name="short_link_button_text">Link breve</string>
|
||||
<string name="simplex_link_channel">Link del canale SimpleX</string>
|
||||
<string name="unsupported_connection_link">Link di connessione non supportato</string>
|
||||
<string name="privacy_short_links">Usa link brevi (BETA)</string>
|
||||
<string name="network_smp_web_port_all">Tutti i server</string>
|
||||
<string name="network_smp_web_port_off">Off</string>
|
||||
<string name="network_smp_web_port_preset">Server preimpostati</string>
|
||||
|
||||
@@ -2379,7 +2379,6 @@
|
||||
<string name="link_requires_newer_app_version_please_upgrade">Voor deze link is een nieuwere app-versie vereist. Werk de app bij of vraag je contactpersoon om een compatibele link te sturen.</string>
|
||||
<string name="full_link_button_text">Volledige link</string>
|
||||
<string name="unsupported_connection_link">Niet-ondersteunde verbindingslink</string>
|
||||
<string name="privacy_short_links">Gebruik korte links (BETA)</string>
|
||||
<string name="short_link_button_text">Korte link</string>
|
||||
<string name="onboarding_conditions_configure_server_operators">Serveroperators configureren</string>
|
||||
<string name="onboarding_conditions_privacy_policy_and_conditions_of_use">Privacybeleid en gebruiksvoorwaarden.</string>
|
||||
|
||||
@@ -2215,7 +2215,6 @@
|
||||
<string name="blocking_reason_spam">Spam</string>
|
||||
<string name="link_requires_newer_app_version_please_upgrade">Acest link necesită o versiune mai nouă a aplicației. Vă rugăm să actualizați aplicația sau să solicitați persoanei de contact să vă trimită un link compatibil.</string>
|
||||
<string name="unsupported_connection_link">Legătură de conexiune neacceptată</string>
|
||||
<string name="privacy_short_links">Utilizați linkuri scurte (BETA)</string>
|
||||
<string name="network_smp_web_port_toggle">Utilizați portul web</string>
|
||||
<string name="operator_conditions_will_be_accepted_for_some"><![CDATA[Condițiile vor fi acceptate pentru operatorul(ii): <b>%s</b>.]]></string>
|
||||
<string name="remote_host_error_timeout"><![CDATA[S-a atins timeout-ul la conectarea la telefonul mobil <b>%s</b>]]></string>
|
||||
|
||||
@@ -2520,6 +2520,5 @@
|
||||
<string name="rcv_group_event_user_accepted">Вы приняты</string>
|
||||
<string name="group_new_support_chat_one">1 чат с членом группы</string>
|
||||
<string name="simplex_link_channel">SimpleX ссылка канала</string>
|
||||
<string name="privacy_short_links">Короткие ссылки (БЕТА)</string>
|
||||
<string name="add_short_link">добавить короткую ссылку</string>
|
||||
</resources>
|
||||
@@ -2378,7 +2378,6 @@
|
||||
<string name="onboarding_conditions_by_using_you_agree">Використовуючи SimpleX Chat, ви погоджуєтесь на:\n- надсилати тільки легальний контент у публічних групах.\n- поважати інших користувачів – без спаму.</string>
|
||||
<string name="onboarding_conditions_configure_server_operators">Налаштувати операторів сервера</string>
|
||||
<string name="onboarding_conditions_privacy_policy_and_conditions_of_use">Політика конфіденційності та умови використання</string>
|
||||
<string name="privacy_short_links">Використовувати короткі посилання (BETA)</string>
|
||||
<string name="link_requires_newer_app_version_please_upgrade">Це посилання вимагає новішої версії додатку. Будь ласка, оновіть додаток або попросіть вашого контакту надіслати сумісне посилання.</string>
|
||||
<string name="full_link_button_text">Повне посилання</string>
|
||||
<string name="short_link_button_text">Коротке посилання</string>
|
||||
|
||||
@@ -2355,7 +2355,6 @@
|
||||
<string name="link_requires_newer_app_version_please_upgrade">Đường dẫn này yêu cầu một phiên bản ứng dụng mới hơn. Vui lòng nâng cấp ứng dụng hoặc yêu cầu liên hệ của một gửi cho một đường dẫn tương thích.</string>
|
||||
<string name="simplex_link_channel">Đường dẫn kênh SimpleX</string>
|
||||
<string name="unsupported_connection_link">Đường dẫn kết nối không được hỗ trợ</string>
|
||||
<string name="privacy_short_links">Sử dụng đường dẫn ngắn (BETA)</string>
|
||||
<string name="full_link_button_text">Toàn bộ đường dẫn</string>
|
||||
<string name="short_link_button_text">Đường dẫn ngắn</string>
|
||||
<string name="network_smp_web_port_off">Tắt</string>
|
||||
|
||||
@@ -2366,7 +2366,6 @@
|
||||
<string name="onboarding_conditions_private_chats_not_accessible">服务器运营方无法访问私密聊天、群组和你的联系人。</string>
|
||||
<string name="onboarding_conditions_configure_server_operators">配置服务器运营方</string>
|
||||
<string name="unsupported_connection_link">不支持的连接链接</string>
|
||||
<string name="privacy_short_links">使用短链接(测试)</string>
|
||||
<string name="simplex_link_channel">SimpleX 频道链接</string>
|
||||
<string name="short_link_button_text">短链接</string>
|
||||
<string name="link_requires_newer_app_version_please_upgrade">此链接需要更新的应用版本。请升级应用或请求你的联系人发送相容的链接。</string>
|
||||
|
||||
@@ -189,7 +189,7 @@ useMemberFilter img_ = \case
|
||||
|
||||
readBlockedWordsConfig :: DirectoryOpts -> IO BlockedWordsConfig
|
||||
readBlockedWordsConfig DirectoryOpts {blockedFragmentsFile, blockedWordsFile, nameSpellingFile, blockedExtensionRules, testing} = do
|
||||
extensionRules <- maybe (pure []) (fmap read . readFile) blockedExtensionRules
|
||||
extensionRules <- maybe (pure []) (fmap read . readFile) blockedExtensionRules
|
||||
spelling <- maybe (pure M.empty) (fmap (M.fromList . read) . readFile) nameSpellingFile
|
||||
blockedFragments <- S.fromList <$> maybe (pure []) (fmap T.lines . T.readFile) blockedFragmentsFile
|
||||
bws <- maybe (pure []) (fmap lines . readFile) blockedWordsFile
|
||||
@@ -348,7 +348,7 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName
|
||||
setGroupRegOwner st gr owner
|
||||
let GroupInfo {groupId, groupProfile = GroupProfile {displayName}} = g
|
||||
notifyOwner gr $ "Joined the group " <> displayName <> ", creating the link…"
|
||||
sendChatCmd cc (APICreateGroupLink groupId GRMember False) >>= \case
|
||||
sendChatCmd cc (APICreateGroupLink groupId GRMember) >>= \case
|
||||
Right CRGroupLinkCreated {groupLink = GroupLink {connLinkContact = CCLink gLink _}} -> do
|
||||
setGroupStatus st gr GRSPendingUpdate
|
||||
notifyOwner
|
||||
@@ -489,7 +489,7 @@ directoryServiceEvent st opts@DirectoryOpts {adminUsers, superUsers, serviceName
|
||||
Nothing -> pure textMsg
|
||||
Just script -> content <$> readProcess script [s] ""
|
||||
where
|
||||
textMsg = MCText $ T.pack s
|
||||
textMsg = MCText $ T.pack s
|
||||
content r = case T.lines $ T.pack r of
|
||||
[] -> textMsg
|
||||
"" : _ -> textMsg
|
||||
|
||||
Reference in new issue
Block a user