(Chat): Display system messages about adding/removing members immediately after an update is performed (#14146)

* (Chat): Display system add/remove messages immediately after update

fixes #9876

* (Chat): Display system "pinned" message immediately after update

fixes #10702

* fix issues from the PR
This commit is contained in:
Andrey Bocharnikov 2024-03-26 21:13:22 +07:00 committed by GitHub
parent 59453e1189
commit c53e4aeb92
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 60 additions and 29 deletions

View File

@ -154,7 +154,7 @@ QtObject:
proc updateOrAddChat*(self: Service, chat: ChatDto)
proc hydrateChannelGroups*(self: Service, data: JsonNode)
proc updateOrAddChannelGroup*(self: Service, channelGroup: ChannelGroupDto, isCommunityChannelGroup: bool = false)
proc processMessageUpdateAfterSend*(self: Service, response: RpcResponse[JsonNode]): (seq[ChatDto], seq[MessageDto])
proc processMessengerResponse*(self: Service, response: RpcResponse[JsonNode]): (seq[ChatDto], seq[MessageDto])
proc doConnect(self: Service) =
self.events.on(SignalType.Message.event) do(e: Args):
@ -195,7 +195,7 @@ QtObject:
self.events.on(SIGNAL_CHAT_REQUEST_UPDATE_AFTER_SEND) do(e: Args):
var args = RpcResponseArgs(e)
discard self.processMessageUpdateAfterSend(args.response)
discard self.processMessengerResponse(args.response)
proc getChannelGroups*(self: Service): seq[ChannelGroupDto] =
return toSeq(self.channelGroups.values)
@ -389,36 +389,64 @@ QtObject:
proc parseChatResponse*(self: Service, response: RpcResponse[JsonNode]): (seq[ChatDto], seq[MessageDto]) =
var chats: seq[ChatDto] = @[]
var messages: seq[MessageDto] = @[]
if response.result{"messages"} != nil:
for jsonMsg in response.result["messages"]:
messages.add(jsonMsg.toMessageDto)
if response.result{"chats"} != nil:
for jsonChat in response.result["chats"]:
let chat = chat_dto.toChatDto(jsonChat)
# TODO add the channel back to `chat` when it is refactored
self.updateOrAddChat(chat)
chats.add(chat)
result = (chats, messages)
let errDesription = response.result{"error"}.getStr
if errDesription != "":
error "Error in parseGroupChatResponse: ", errDesription
else:
if response.result{"messages"} != nil:
for jsonMsg in response.result["messages"]:
messages.add(jsonMsg.toMessageDto)
if response.result{"chats"} != nil:
for jsonChat in response.result["chats"]:
let chat = chat_dto.toChatDto(jsonChat)
# TODO add the channel back to `chat` when it is refactored
self.updateOrAddChat(chat)
chats.add(chat)
return (chats, messages)
proc processMessageUpdateAfterSend*(self: Service, response: RpcResponse[JsonNode]): (seq[ChatDto], seq[MessageDto]) =
result = self.parseChatResponse(response)
var (chats, messages) = result
proc signalChatsAndMessagesUpdates*(self: Service, chats: seq[ChatDto], messages: seq[MessageDto]) =
if chats.len == 0 or messages.len == 0:
error "no chats or messages in the parsed response"
return
for chat in chats:
if (chat.active):
self.events.emit(SIGNAL_CHAT_CREATED, CreatedChatArgs(chat: chat))
var chatMap: Table[string, ChatDto] = initTable[string, ChatDto]()
for chat in chats:
chatMap[chat.id] = chat
for msg in messages:
for chat in chats:
if chat.id == msg.chatId:
self.events.emit(SIGNAL_SENDING_SUCCESS, MessageSendingSuccess(message: msg, chat: chat))
break
if chatMap.hasKey(msg.chatId):
let chat = chatMap[msg.chatId]
self.events.emit(SIGNAL_SENDING_SUCCESS, MessageSendingSuccess(message: msg, chat: chat))
proc processMessengerResponse*(self: Service, response: RpcResponse[JsonNode]): (seq[ChatDto], seq[MessageDto]) =
result = self.parseChatResponse(response)
var (chats, messages) = result
self.signalChatsAndMessagesUpdates(chats, messages)
proc processGroupChatResponse*(self: Service, response: RpcResponse[JsonNode]) =
proc parseGroupChatResponse(response: RpcResponse[JsonNode]): (ChatDto, seq[MessageDto], string) =
var chat: ChatDto
var messages: seq[MessageDto] = @[]
let errorDescription = response.result{"error"}.getStr
if response.result{"chat"} != nil:
chat = chat_dto.toChatDto(response.result["chat"])
if response.result{"messages"} != nil:
for jsonMsg in response.result["messages"]:
messages.add(jsonMsg.toMessageDto)
return (chat, messages, errorDescription)
var (chat, messages, errorDescription) = parseGroupChatResponse(response)
if errorDescription != "":
error "Received an error in the ProcessGroupChatResponse: ", errorDescription
else:
self.updateOrAddChat(chat)
self.signalChatsAndMessagesUpdates(@[chat], messages)
proc processUpdateForTransaction*(self: Service, messageId: string, response: RpcResponse[JsonNode]) =
var (chats, _) = self.processMessageUpdateAfterSend(response)
var (chats, _) = self.processMessengerResponse(response)
# TODO: Signal is not handled anywhere
self.events.emit(SIGNAL_MESSAGE_REMOVE, MessageArgs(id: messageId, channel: chats[0].id))
@ -533,7 +561,7 @@ QtObject:
for imagePath in imagePaths:
removeFile(imagePath)
discard self.processMessageUpdateAfterSend(response)
discard self.processMessengerResponse(response)
except Exception as e:
error "Error sending images", msg = e.msg
result = fmt"Error sending images: {e.msg}"
@ -560,7 +588,7 @@ QtObject:
linkPreviews,
communityId) # Only send a community ID for the community invites
let (chats, messages) = self.processMessageUpdateAfterSend(response)
let (chats, messages) = self.processMessengerResponse(response)
if chats.len == 0 or messages.len == 0:
self.events.emit(SIGNAL_SENDING_FAILED, ChatArgs(chatId: chatId))
except Exception as e:
@ -570,7 +598,7 @@ QtObject:
try:
let address = if (tokenAddress == ZERO_ADDRESS): "" else: tokenAddress
let response = status_chat_commands.requestAddressForTransaction(chatId, fromAddress, amount, address)
discard self.processMessageUpdateAfterSend(response)
discard self.processMessengerResponse(response)
except Exception as e:
error "Error requesting address for transaction", msg = e.msg
@ -578,7 +606,7 @@ QtObject:
try:
let address = if (tokenAddress == ZERO_ADDRESS): "" else: tokenAddress
let response = status_chat_commands.requestTransaction(chatId, fromAddress, amount, address)
discard self.processMessageUpdateAfterSend(response)
discard self.processMessengerResponse(response)
except Exception as e:
error "Error requesting transaction", msg = e.msg
@ -606,7 +634,7 @@ QtObject:
proc acceptRequestTransaction*(self: Service, transactionHash: string, messageId: string, signature: string) =
try:
let response = status_chat_commands.acceptRequestTransaction(transactionHash, messageId, signature)
discard self.processMessageUpdateAfterSend(response)
discard self.processMessengerResponse(response)
except Exception as e:
error "Error requesting transaction", msg = e.msg
@ -665,6 +693,7 @@ QtObject:
let response = status_group_chat.addMembers(communityID, chatId, members)
if (response.error.isNil):
self.events.emit(SIGNAL_CHAT_MEMBERS_ADDED, ChatMembersAddedArgs(chatId: chatId, ids: members))
self.processGroupChatResponse(response)
except Exception as e:
error "error while adding group members: ", msg = e.msg
@ -673,6 +702,7 @@ QtObject:
let response = status_group_chat.removeMember(communityID, chatId, member)
if (response.error.isNil):
self.events.emit(SIGNAL_CHAT_MEMBER_REMOVED, ChatMemberRemovedArgs(chatId: chatId, id: member))
self.processGroupChatResponse(response)
except Exception as e:
error "error while removing member from group: ", msg = e.msg

View File

@ -2085,7 +2085,7 @@ QtObject:
# We no longer send invites, but merely share the community so
# users can request access (with automatic acception)
let response = status_go.shareCommunityToUsers(communityId, pubKeys, inviteMessage)
discard self.chatService.processMessageUpdateAfterSend(response)
discard self.chatService.processMessengerResponse(response)
except Exception as e:
error "Error sharing community", msg = e.msg
result = "Error sharing community: " & e.msg

View File

@ -644,6 +644,7 @@ QtObject:
if(not pinned and not pin):
self.numOfPinnedMessagesPerChat[chatId] = self.getNumOfPinnedMessages(chatId) - 1
self.events.emit(SIGNAL_MESSAGE_UNPINNED, data)
discard self.chatService.processMessengerResponse(response)
except Exception as e:
error "error: ", procName="pinUnpinMessage", errName = e.name, errDesription = e.msg

View File

@ -369,7 +369,7 @@ QtObject:
communityId = "", # communityId is not necessary when sending a sticker
sticker.hash,
sticker.packId)
discard self.chatService.processMessageUpdateAfterSend(response)
discard self.chatService.processMessengerResponse(response)
self.addStickerToRecent(sticker)
proc removeRecentStickers*(self: Service, packId: string) =