mirror of
https://github.com/permissionlesstech/bitchat.git
synced 2026-07-25 00:25:19 +00:00
Merge pull request #30 from jackjackbits/feature/screenshot-detection
Add screenshot detection notifications
This commit is contained in:
@@ -130,6 +130,14 @@ class ChatViewModel: ObservableObject {
|
|||||||
name: UIApplication.didBecomeActiveNotification,
|
name: UIApplication.didBecomeActiveNotification,
|
||||||
object: nil
|
object: nil
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Add screenshot detection for iOS
|
||||||
|
NotificationCenter.default.addObserver(
|
||||||
|
self,
|
||||||
|
selector: #selector(userDidTakeScreenshot),
|
||||||
|
name: UIApplication.userDidTakeScreenshotNotification,
|
||||||
|
object: nil
|
||||||
|
)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1058,6 +1066,72 @@ class ChatViewModel: ObservableObject {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@objc private func userDidTakeScreenshot() {
|
||||||
|
// Send screenshot notification based on current context
|
||||||
|
let screenshotMessage = "* \(nickname) took a screenshot *"
|
||||||
|
|
||||||
|
if let peerID = selectedPrivateChatPeer {
|
||||||
|
// In private chat - send to the other person
|
||||||
|
if let peerNickname = meshService.getPeerNicknames()[peerID] {
|
||||||
|
// Send the message directly without going through sendPrivateMessage to avoid local echo
|
||||||
|
meshService.sendPrivateMessage(screenshotMessage, to: peerID, recipientNickname: peerNickname)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show local notification immediately as system message
|
||||||
|
let localNotification = BitchatMessage(
|
||||||
|
sender: "system",
|
||||||
|
content: "you took a screenshot",
|
||||||
|
timestamp: Date(),
|
||||||
|
isRelay: false,
|
||||||
|
originalSender: nil,
|
||||||
|
isPrivate: true,
|
||||||
|
recipientNickname: meshService.getPeerNicknames()[peerID],
|
||||||
|
senderPeerID: meshService.myPeerID
|
||||||
|
)
|
||||||
|
if privateChats[peerID] == nil {
|
||||||
|
privateChats[peerID] = []
|
||||||
|
}
|
||||||
|
privateChats[peerID]?.append(localNotification)
|
||||||
|
|
||||||
|
} else if let channel = currentChannel {
|
||||||
|
// In a channel - send to channel
|
||||||
|
// Check if channel is password protected and encrypt if needed
|
||||||
|
if let channelKey = channelKeys[channel] {
|
||||||
|
meshService.sendEncryptedChannelMessage(screenshotMessage, mentions: [], channel: channel, channelKey: channelKey)
|
||||||
|
} else {
|
||||||
|
meshService.sendMessage(screenshotMessage, mentions: [], channel: channel)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show local notification immediately as system message
|
||||||
|
let localNotification = BitchatMessage(
|
||||||
|
sender: "system",
|
||||||
|
content: "you took a screenshot",
|
||||||
|
timestamp: Date(),
|
||||||
|
isRelay: false,
|
||||||
|
originalSender: nil,
|
||||||
|
isPrivate: false,
|
||||||
|
channel: channel
|
||||||
|
)
|
||||||
|
if channelMessages[channel] == nil {
|
||||||
|
channelMessages[channel] = []
|
||||||
|
}
|
||||||
|
channelMessages[channel]?.append(localNotification)
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// In public chat - send to everyone
|
||||||
|
meshService.sendMessage(screenshotMessage, mentions: [], channel: nil)
|
||||||
|
|
||||||
|
// Show local notification immediately as system message
|
||||||
|
let localNotification = BitchatMessage(
|
||||||
|
sender: "system",
|
||||||
|
content: "you took a screenshot",
|
||||||
|
timestamp: Date(),
|
||||||
|
isRelay: false
|
||||||
|
)
|
||||||
|
messages.append(localNotification)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func markPrivateMessagesAsRead(from peerID: String) {
|
func markPrivateMessagesAsRead(from peerID: String) {
|
||||||
// Get the nickname for this peer
|
// Get the nickname for this peer
|
||||||
let peerNickname = meshService.getPeerNicknames()[peerID] ?? ""
|
let peerNickname = meshService.getPeerNicknames()[peerID] ?? ""
|
||||||
@@ -2438,9 +2512,10 @@ extension ChatViewModel: BitchatDelegate {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if this is a hug/slap action that should be converted to system message
|
// Check if this is an action that should be converted to system message
|
||||||
let isActionMessage = messageToStore.content.hasPrefix("* ") && messageToStore.content.hasSuffix(" *") &&
|
let isActionMessage = messageToStore.content.hasPrefix("* ") && messageToStore.content.hasSuffix(" *") &&
|
||||||
(messageToStore.content.contains("🫂") || messageToStore.content.contains("🐟"))
|
(messageToStore.content.contains("🫂") || messageToStore.content.contains("🐟") ||
|
||||||
|
messageToStore.content.contains("took a screenshot"))
|
||||||
|
|
||||||
if isActionMessage {
|
if isActionMessage {
|
||||||
// Convert to system message
|
// Convert to system message
|
||||||
@@ -2621,9 +2696,10 @@ extension ChatViewModel: BitchatDelegate {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if this is a hug/slap action that should be converted to system message
|
// Check if this is an action that should be converted to system message
|
||||||
let isActionMessage = messageToAdd.content.hasPrefix("* ") && messageToAdd.content.hasSuffix(" *") &&
|
let isActionMessage = messageToAdd.content.hasPrefix("* ") && messageToAdd.content.hasSuffix(" *") &&
|
||||||
(messageToAdd.content.contains("🫂") || messageToAdd.content.contains("🐟"))
|
(messageToAdd.content.contains("🫂") || messageToAdd.content.contains("🐟") ||
|
||||||
|
messageToAdd.content.contains("took a screenshot"))
|
||||||
|
|
||||||
let finalMessage: BitchatMessage
|
let finalMessage: BitchatMessage
|
||||||
if isActionMessage {
|
if isActionMessage {
|
||||||
@@ -2675,9 +2751,10 @@ extension ChatViewModel: BitchatDelegate {
|
|||||||
} else {
|
} else {
|
||||||
// Regular public message (main chat)
|
// Regular public message (main chat)
|
||||||
|
|
||||||
// Check if this is a hug/slap action that should be converted to system message
|
// Check if this is an action that should be converted to system message
|
||||||
let isActionMessage = message.content.hasPrefix("* ") && message.content.hasSuffix(" *") &&
|
let isActionMessage = message.content.hasPrefix("* ") && message.content.hasSuffix(" *") &&
|
||||||
(message.content.contains("🫂") || message.content.contains("🐟"))
|
(message.content.contains("🫂") || message.content.contains("🐟") ||
|
||||||
|
message.content.contains("took a screenshot"))
|
||||||
|
|
||||||
if isActionMessage {
|
if isActionMessage {
|
||||||
// Convert to system message
|
// Convert to system message
|
||||||
|
|||||||
@@ -190,7 +190,7 @@ struct ContentView: View {
|
|||||||
Image(systemName: "lock.fill")
|
Image(systemName: "lock.fill")
|
||||||
.font(.system(size: 14))
|
.font(.system(size: 14))
|
||||||
.foregroundColor(Color.orange)
|
.foregroundColor(Color.orange)
|
||||||
Text("private: \(privatePeerNick)")
|
Text("\(privatePeerNick)")
|
||||||
.font(.system(size: 16, weight: .medium, design: .monospaced))
|
.font(.system(size: 16, weight: .medium, design: .monospaced))
|
||||||
.foregroundColor(Color.orange)
|
.foregroundColor(Color.orange)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user