RegistroMensagens

// 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.

Last updated