// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract RegistroMensagens {
// Estrutura que representa uma mensagem
struct Mensagem {
uint256 id; // ID único da mensagem
address from; // Endereço do remetente
address to; // Endereço do destinatário
string text; // Conteúdo da mensagem
uint256 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 mensagens
mapping(address => uint256[]) public mensagensIndex;
// Definição de um erro customizado para um índice inválido
error ErrorIndexInvalid(uint256 index);
// Evento que será emitido quando uma nova mensagem for registrada
event MensagemRegistrada(
uint256 id,
address to,
string conteudo,
uint256 timestamp
);
// Função para enviar uma mensagem
function enviarMensagem(string memory _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 registrada
emit MensagemRegistrada(novoId, _to, _conteudo, block.timestamp);
}
// Função para obter todas as mensagens
function obterTodasMensagens() public view returns (Mensagem[] memory) {
return mensagens;
}
// Função para obter uma mensagem específica por seu índice
function obterMensagem(uint256 index)
public
view
returns (Mensagem memory)
{
// Verifica se o índice é válido
if (index >= mensagens.length) {
revert ErrorIndexInvalid(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 chamador
function obterMinhasMensagemIndex() public view returns (uint256[] memory) {
return mensagensIndex[msg.sender];
}
// Função para obter todas as mensagens enviadas para o chamador
function obterMinhasMensagem() public view returns (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.