segunda-feira, 25 de outubro de 2010

Explorar Mensagem do Moodle com Comando SQL

A Plataforma Moodle tem um sistema de envio de mensagem interna. Caso você precise explorar   esse sistema sem usar a interface do Moodle, será necessário escrever comando SQL para comunicar diretamente com a base de dados.

    Através do comando SQL você pode:
  • Consultar histórico de mensagens enviadas; 
  • Pesquisar conteúdo das mensagens;

  • Apagar mensagens que ainda não foram lidas;
  • Pesquisar usuário que mais enviaram ou receberam mensagens.

As mensagens do Moodle são organizadas em duas tabelas:
  • mdl_message – Tabela que registra as mensagens enviadas
  • mdl_message_read - Tabela que registra as mensagens lidas. Armazena o histórico das mensagens.

    Quando uma mensagem é enviada, é armazenada na tabela mdl_message. Quando o destinatário recebe, ou seja, visualiza  na tela, a mensagem é transferida para a tabela mdl_message_read. Na tabela    mdl_message  só ficam  as mensagens que ainda não foram lidas. Já a  tabela mdl_message_read  só ficam as mensagens que já foram lidas.


Agora que já entendeu como funciona as tabelas, vamos ver os comandos SQL.

1- Consultar todas as mensagens enviadas que ainda não foram lidas.
SELECT m.id,m.timecreated, r.firstname, r.lastname,d.firstname, d.lastname, m.message FROM mdl_user r INNER JOIN mdl_message m ON r.id=m.useridfrom INNER JOIN mdl_user d ON d.id=m.useridto

Essa consultar retorna os seguintes campos:
  • m.id  - Id da mensagem
  • m.timecreated – Data do envio da mensagem
  • r.firstname e r.lastname – Nome do remitente
  • d.firstname e d.lastname – Nome do destinatário
  • m.message – Texto da mensagem

2- Consultar todas as mensagens lidas – Histórico de mensagens.


SELECT m.id,m.timecreated, m.timeread,r.firstname, r.lastname,d.firstname,d.lastname, m.message,m.mailed FROM mdl_user r INNER JOIN mdl_message_read m ON r.id=m.useridfrom INNER JOIN mdl_user d ON d.id=m.useridto

Essa consultar retorna os seguintes campos:
  • m.id  - Id da mensagem
  • m.timecreated – Data do envio da mensagem
  • m.timeread – Data da leitura da mensagem
  • r.firstname e r.lastname – Nome do remitente
  • d.firstname e d.lastname – Nome do destinatário
  • m.message – Texto da mensagem
  • m.mailed – Controle de envio de mensagem por e-mail

3 - Monitorar as mensagens enviadas por um determinado usuário que ainda não foram  lidas

SELECT m.id,m.timecreated, d.firstname, d.lastname, m.message FROM mdl_message m  INNER JOIN mdl_user d ON d.id=m.useridto WHERE m.useridfrom=?

Passe o parâmetro id do usuário em  m.useridfrom=?

Essa consultar retorna os seguintes campos:
  • m.id  - Id da mensagem
  • m.timecreated – Data do envio da mensagem
  • d.firstname e d.lastname – Nome do destinatário
  • m.message – Texto da mensagem

4 - Monitorar histórico das  mensagens enviadas por um determinado usuário. Mensagens lidas pelos destinatários.

SELECT m.id,m.timecreated, m.timeread, d.firstname, d.lastname, m.message, m.mailed  FROM mdl_message_read m  INNER JOIN mdl_user d ON d.id=m.useridto WHERE m.useridfrom=?

Passe o parâmetro id do usuário em  m.useridfrom=?


Essa consultar retorna os seguintes campos:
  • m.id  - Id da mensagem
  • m.timecreated – Data do envio da mensagem
  • m.timeread – Data da leitura da mensagem
  • d.firstname e d.lastname – Nome do destinatário
  • m.message – Texto da mensagem
  • m.mailed – Controle de envio de mensagem por e-mail

5- Pesquisar o conteúdo das mensagens enviadas no histórico das mensagens pela palavra-chave


SELECT m.id,m.timecreated, m.timeread,r.firstname, r.lastname,d.firstname,d.lastname, m.message,m.mailed FROM mdl_user r INNER JOIN mdl_message_read m ON r.id=m.useridfrom INNER JOIN mdl_user d ON d.id=m.useridto WHERE m.message LIKE '%texto da pesquisa%'

Passe o texto a ser pesquisado no comando  LIKE '%texto da pesquisa%'
Essa consultar retorna os mesmos campos da pesquisa do item 2.

6- Lista de usuários que mais enviarem  as mensagens
SELECT r.firstname, r.lastname,d.firstname, COUNT(m.useridfrom)  FROM mdl_user r INNER JOIN mdl_message_read m ON r.id=m.useridfrom INNER JOIN mdl_user d ON d.id=m.useridto GROUP BY r.firstname, r.lastname,d.firstname ORDER BY COUNT(m.useridfrom) DESC

Essa consulta retorna uma lista de usuários  (remetentes) e quantidade de mensagens enviadas pela ordem decrescente.  Lista os usuários que mais enviaram as mensagens.

Essa consulta é feita no histórico de mensagens. Para efetuá-la nas mensagens recentes, ou seja,  ainda não lidas, basta substituir a tabela  mdl_message_read para  mdl_message e mantar o restante de código inalterado.


7- Lista de usuários que mais receberam mensagens

SELECT d.firstname, d.lastname,d.firstname, COUNT(m.useridto)  FROM mdl_user d INNER JOIN mdl_message_read m ON  d.id=m.useridto GROUP BY d.firstname, d.lastname,d.firstname ORDER BY COUNT(m.useridto) DESC

Essa consulta retorna uma lista de usuários  (destinatários) e quantidade de mensagem recebidas pela ordem decrescente.  Lista os usuários que mais receberam as mensagens.

Essa consulta é feita no histórico de mensagens. Para efetuá-la nas mensagens recentes, ou seja,  ainda não lida, basta substituir a tabela  mdl_message_read para  mdl_message e mantar o restante de código inalterado.

8 – Apagar as mensagens enviada que ainda não foram lidas

DELETE  FROM mdl_message

9 – Apagar  o histórico das mensagens. Mensagens lidas

DELETE  FROM mdl_message_read

    Essas dicas ajudam você a desvendar como é organizado as mensagens no Moodle na camada de base de dados. Isso é tudo que você precisa para mapear erros ou falha do Moodle e também para para planejar integração com outros sistemas.

6 comentários:

  1. Bom dia. Temos uma plataforma em regime experimental, porém a direção da escola já deseja usá-la para aplicação de provas. Creio que não sei como bloquear estas mensagens e/ou saber se os alunos já usam este recurso. Mesmo com o tutorial acima não sei como usar estes comandos para retornar um relatório de mensagens enviadas. Onde digito estes comandos?

    ResponderExcluir
    Respostas
    1. Digite o comando em um terminal de acesos ao banco de dados. Você pode usar qualquer cliente SQL de banco de dados.

      Excluir
  2. Olá, utilizamos o Moodle 1.9 e precisamos bloquear qualquer tipo de comunicação dentro do Moodle com determinado grupo de participantes. Criei uma função onde o aluno só possui permissão para ver o conteúdo do curso e as atividades. Todas as outras permissões foram bloqueadas. Porém, o aluno ainda consegue acessar seu perfil quando clica em seu nome no canto superior direito em "Você acessou como ---". E no perfil consegue acessar o sistema de mensagens. Em Administração do site -> Segurança -> Políticas do site, o sistema de mensagens está ativado e isso prevalece ao bloqueio de envio de mensagens na função do aluno. Não posso desativar o sistema, pois afetará todos os usuários do site. Agradeço qualquer ajuda.

    ResponderExcluir
    Respostas
    1. A permissão do moodle que possibilita o usuário a enviar mensagem é moodle/site:sendmessage

      Se essa permissão for inabilitada no perfil Usuário Autenticado nenhum aluno consegue enviar mensagem interna. Quanto a possibilidade de desativar essa função para um grupo específico de usuário, acredito que seja possível. No entanto, não consegui chegar a esse resultado nas pesquisas que fiz. Mesmo inabilitando a permissão moodle/site:sendmessage no perfil do usuário e configurando a sobreposição de permissão não tive sucesso. Caso alguém consegua isso, me avise.
      De momento, a alternativa que vejo é hack no código para que apenas um determinado grupo de usuário seja inabilitado para enviar mensagem interna.

      Excluir
    2. Badiu, obrigado pela tentativa.

      Também não encontramos solução e como tínhamos urgência desse serviço, "duplicamos" o Moodle no datacenter para ser utilizado pelo grupo de alunos sem comunicação, desativando o sistema de mensagens.

      Abraços!

      Excluir
    3. Oi Gente! Não sei se a nossa solução meio que "forçada" servirá para o que vocês estão necessitando.
      Para que um usuário não possa bloquear um outro usuário do Moodle (Ex: para que um estudante não possa bloquear um tutor), fizemos o seguinte procedimento:

      * Identificamos a função que possibilita o bloqueio.
      Caminho no Moodle: moodle/message/index.php? viewing=unread&blockcontact

      * Dentro do arquivo comentar da linha: 134 à 137.

      Nas mensagens pessoais o ícone que representa o bloqueio ainda aparecerá, mas não executará a sua função.

      Desta mesma forma acredito que poderá ser bloqueada a funcionalidade envio de mensagens, no arquivo: moodle/message/index.php
      Dá uma procurada com carinho.

      Excluir