// SPDX-License-Identifier: MITpragmasolidity ^0.8.0;contract RegistroMensagens {// Estrutura que representa uma mensagemstructMensagem {uint256 id; // ID único da mensagemaddress from; // Endereço do remetenteaddress to; // Endereço do destinatáriostring text; // Conteúdo da mensagemuint256 timestamp; // Timestamp do momento em que a mensagem foi enviada } // Comentado: Um modificador de função que restringe o acesso ao proprietário do contrato (não utilizado no momento)
/* modifier onlyOwner { require(msg.sender == owner); _; } */// Array para armazenar todas as mensagens enviadas Mensagem[] public mensagens;// Mapeamento do endereço do destinatário para um array de índices de mensagensmapping(address=>uint256[]) public mensagensIndex;// Definição de um erro customizado para um índice inválidoerrorErrorIndexInvalid(uint256 index);// Evento que será emitido quando uma nova mensagem for registradaeventMensagemRegistrada(uint256 id,address to,string conteudo,uint256 timestamp );// Função para enviar uma mensagemfunctionenviarMensagem(stringmemory_conteudo,address_to) public {uint256 novoId = mensagens.length; // Obter o próximo ID disponível (tamanho do array)// Criar uma nova mensagem Mensagem memory novaMensagem =Mensagem( novoId, msg.sender,// Remetente é o endereço que chamou a função _to,// Destinatário fornecido como argumento _conteudo,// Conteúdo da mensagem block.timestamp // Timestamp atual do bloco ); mensagens.push(novaMensagem); // Adicionar a nova mensagem ao array de mensagens mensagensIndex[_to].push(mensagens.length -1); // Adicionar o índice da nova mensagem ao mapeamento// Emitir o evento de mensagem registradaemitMensagemRegistrada(novoId, _to, _conteudo, block.timestamp); }// Função para obter todas as mensagensfunctionobterTodasMensagens() publicviewreturns (Mensagem[] memory) {return mensagens; }// Função para obter uma mensagem específica por seu índicefunctionobterMensagem(uint256 index)publicviewreturns (Mensagemmemory) {// Verifica se o índice é válidoif (index >= mensagens.length) {revertErrorIndexInvalid(index); // Reverte a transação com o erro customizado }return mensagens[index]; // Retorna a mensagem no índice especificado }// Função para obter os índices de todas as mensagens enviadas para o chamadorfunctionobterMinhasMensagemIndex() publicviewreturns (uint256[] memory) {return mensagensIndex[msg.sender]; }// Função para obter todas as mensagens enviadas para o chamadorfunctionobterMinhasMensagem() publicviewreturns (Mensagem[] memory) {// Declarar um array de mensagens para armazenar as mensagens do chamador Mensagem[] memory minhasMensagens =new Mensagem[](mensagensIndex[msg.sender].length);/* DESAFIO : Esse método retornará todas as mensagens enviadas para o chamador (msg.sender). (to) */return minhasMensagens; // Retorna o array de mensagens do chamador }}
Estrutura Mensagem: Define os atributos que compõem uma mensagem.
Array mensagens: Armazena todas as mensagens enviadas.
Mapping mensagensIndex: Relaciona o endereço do destinatário com os índices das mensagens que ele recebeu.
Erro Customizado ErrorIndexInvalid: Utilizado para reverter transações com um índice inválido.
Evento MensagemRegistrada: Notifica quando uma nova mensagem é registrada.
Função enviarMensagem: Envia uma nova mensagem, armazenando-a no array e no mapping, além de emitir um evento.
Função obterTodasMensagens: Retorna todas as mensagens.
Função obterMensagem: Retorna uma mensagem específica, verificando a validade do índice.
Função obterMinhasMensagemIndex: Retorna os índices das mensagens recebidas pelo chamador.
Função obterMinhasMensagem: Retorna todas as mensagens recebidas pelo chamador, utilizando os índices armazenados no mapping.