mirror of
https://github.com/permissionlesstech/bitchat.git
synced 2026-07-24 23: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,
|
||||
object: nil
|
||||
)
|
||||
|
||||
// Add screenshot detection for iOS
|
||||
NotificationCenter.default.addObserver(
|
||||
self,
|
||||
selector: #selector(userDidTakeScreenshot),
|
||||
name: UIApplication.userDidTakeScreenshotNotification,
|
||||
object: nil
|
||||
)
|
||||
#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) {
|
||||
// Get the nickname for this peer
|
||||
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(" *") &&
|
||||
(messageToStore.content.contains("🫂") || messageToStore.content.contains("🐟"))
|
||||
(messageToStore.content.contains("🫂") || messageToStore.content.contains("🐟") ||
|
||||
messageToStore.content.contains("took a screenshot"))
|
||||
|
||||
if isActionMessage {
|
||||
// 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(" *") &&
|
||||
(messageToAdd.content.contains("🫂") || messageToAdd.content.contains("🐟"))
|
||||
(messageToAdd.content.contains("🫂") || messageToAdd.content.contains("🐟") ||
|
||||
messageToAdd.content.contains("took a screenshot"))
|
||||
|
||||
let finalMessage: BitchatMessage
|
||||
if isActionMessage {
|
||||
@@ -2675,9 +2751,10 @@ extension ChatViewModel: BitchatDelegate {
|
||||
} else {
|
||||
// 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(" *") &&
|
||||
(message.content.contains("🫂") || message.content.contains("🐟"))
|
||||
(message.content.contains("🫂") || message.content.contains("🐟") ||
|
||||
message.content.contains("took a screenshot"))
|
||||
|
||||
if isActionMessage {
|
||||
// Convert to system message
|
||||
|
||||
@@ -190,7 +190,7 @@ struct ContentView: View {
|
||||
Image(systemName: "lock.fill")
|
||||
.font(.system(size: 14))
|
||||
.foregroundColor(Color.orange)
|
||||
Text("private: \(privatePeerNick)")
|
||||
Text("\(privatePeerNick)")
|
||||
.font(.system(size: 16, weight: .medium, design: .monospaced))
|
||||
.foregroundColor(Color.orange)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user