Kit de Construção para Discord Bot 🤖

Ótimo. A propósito, ficarei feliz em considerar quaisquer melhorias genéricas úteis para este plugin, caso você decida voltar a programar :wink:

2 curtidas

Ok, vamos começar devagar. Acabei de enviar meu primeiro pull request para este repositório :smile:.

4 curtidas

mesclado :slight_smile: obrigado!

4 curtidas

Ei! Tenho tentado encontrar um plugin que conceda aos usuários do Discord uma função com base nas medalhas que possuem em seu perfil do Discourse. Isso é possível com o seu plugin? Se não, é possível de alguma forma? Obrigado!

2 curtidas

Não no momento, mas não há razão para você não fazer um fork e adicionar um comando apropriado para implementar isso!

Se implementado corretamente, eu consideraria mesclar um PR. No entanto, pode ser um pouco específico para uso geral, porque presumivelmente você teria que manter algum tipo de mapeamento, a menos que os nomes dos emblemas fossem os mesmos que os nomes das funções? De qualquer forma, você teria que filtrar a maioria deles? Isso pode ficar confuso para uso geral. Se você encontrar uma maneira realmente limpa de gerenciar isso que funcione para usuários gerais do plugin, me avise.

Mas faça o fork à vontade, divirta-se!

2 curtidas

Com certeza gostaria de ver se é possível. Isso me deixaria ainda mais interessado neste plugin. :smiley:

1 curtida

Só uma pequena dúvida: precisamos executar manualmente !discsync toda vez que quisermos atualizar as funções, ou é automático?

2 curtidas

Infelizmente, sim. Seria uma boa melhoria adicionar um parâmetro ‘repetir em x horas’ (PR é bem-vindo ou me contrate para implementar), mas, como já mencionei antes neste tópico, seria melhor que alguém criasse um novo plugin usando a API deles e configurasse alguns jobs agendados no Sidekiq para fazer isso. Um bot é uma solução divertida, mas não a melhor arquitetura para sincronização agendada.

2 curtidas

Ah, obrigado de qualquer forma. Sim, já pensamos em uma possível alternativa…

Queríamos sincronizar grupos do Discourse com cargos do Discord, mas parece que não há uma solução perfeita que se encaixe.

Agora vamos criar algum tipo de bot usando webhooks: o Discourse acionará um webhook quando os grupos de um usuário forem atualizados (ou também quando o nome de usuário mudar) para uma solução personalizada, que então atribuirá cargos no Discord. Continuaremos usando a opção de OAuth do Discord para obter guildas e, ao criar uma consulta personalizada no Data Explorer, poderemos acessar essas guildas por meio da API.

Seria algo assim:

  1. O usuário altera os grupos ou o nome de usuário
  2. Um webhook é acionado para a solução personalizada
  3. Essa solução personalizada fará uma chamada de volta à API do Data Explorer para uma consulta personalizada que retorna as guildas do usuário
  4. Com essa guilda, chamamos o Discord de volta para atualizar os cargos
2 curtidas

Um trabalho em lote adequado seria melhor, para que você não perca a integridade dos dados devido a falhas pontuais de eventos. Ambos seriam perfeitos.

2 curtidas

Bem, eu não passei por esse caminho… :sweat_smile:
Forki seu repositório e criei um novo plugin que atendeu às nossas necessidades:

Ele basicamente sincroniza todos os grupos com funções do Discord, mas automaticamente. Quando um usuário é adicionado ou removido de um grupo, ele executa um trabalho de sincronização e atualiza as funções dele de acordo com os grupos públicos. Além disso, adicionei uma configuração para marcar uma “função verificada”, que será adicionada a todos os usuários que possuem uma conta no Discourse. Também é possível adicionar uma lista de funções seguras, que o bot ignorará ao sincronizar os usuários (útil, por exemplo, se quiser definir administradores e moderadores diferentes no servidor do que no fórum).

Também adicionei um sincronizador de nome de usuário-nick. Ele pode obrigar os usuários a terem o mesmo nick no servidor que o nome de usuário no fórum.

Vou abrir um tópico na categoria #plugin depois de organizar algumas coisas, já que talvez alguém ache útil.

7 curtidas

@barreeeiroo o que foi realmente interessante no seu fork foi o uso dos hooks DiscourseEvents.

Eu havia assumido que isso não seria possível porque o bot roda em uma thread separada. Mas, como você descobriu, parece que podemos agir sobre eventos e influenciar o bot. Então, obrigado por isso; é uma percepção muito importante que podemos desenvolver daqui para frente.

Por isso, comecei a adotar essa técnica no repositório principal, começando com a capacidade de configurar alguns acompanhamentos em novas postagens ou tópicos que serão anunciados no canal de administração do Discord.

A funcionalidade pode ser de pouca utilidade no estado atual, mas demonstra o conceito para que outros possam aproveitá-lo.

5 curtidas

OK, desenvolvi um pouco mais o plugin e agora tenho um POC de comunicação bidirecional funcionando:

Aqui estão as novas configurações:

  • Você pode designar um Canal de Anúncios no Discord nas configurações do plugin.

  • Agora você pode digitar no Canal de Anúncios do Discord atribuído e isso postará sua mensagem no Tópico do Discourse atribuído nas configurações do plugin.

  • Você pode configurar uma lista de Categorias no Discourse para postar no canal de Anúncios do seu Discord se alguém postar lá ou criar um novo Tópico (uma ou ambas as opções).

Além disso, adicionei um novo arquivo para gerenciar eventos do Discord suportados pela API discordrb, sendo a lógica de Anúncios o primeiro exemplo (sinta-se à vontade para desenvolver novos e enviar um PR se forem úteis para a comunidade).

Também removi as alterações necessárias no app.yml para instalar o libsodium-dev, pois isso agora é opcional, após atualizar as dependências, e não é necessário para o plugin no momento (não há necessidade de lidar com voz). Isso tornará a instalação muito mais simples.

9 curtidas

Segui as instruções de instalação e tudo correu bem até a reinicialização. O bot não entrou na sala, então verifiquei /logs:

Isso está se referindo ao discord_bot_token? Ele está preenchido e verifiquei o valor. Alguma pista?

3 curtidas

Mark, desculpe, de alguma forma perdi isso.

Você descobriu o problema?

Você pode, por favor, atualizar e tentar a nova versão e seguiremos a partir daí.

2 curtidas

Uma atualização significativa financiada pela equipe do Discourse :tada:

FEATURES: nova cópia automática de mensagens e comando de cópia de histórico por merefield · Pull Request #4 ·
merefield/discourse-discord-bot (github.com)

  1. Um novo comando !disccopy <número-de-mensagens> <nome-opcional-da-categoria-de-destino> <nome-opcional-do-tópico-de-destino> que permite copiar o histórico de mensagens do Discord (nesse canal) para sua instância do Discourse a partir do chat do Discord. Isso pode lidar com segurança com milhares de mensagens de uma vez (mas para esse volume levará tempo).

  2. Cópia automática de chat por mensagem, por canal para qualquer Categoria com o mesmo nome no Discourse: se o nome do canal corresponder ao nome da Categoria, ele copiará a mensagem para o Discourse se isso estiver configurado:
    image

  3. Para qualquer mensagem copiada para o Discourse do Discord, o Usuário agora será exibido corretamente se esse usuário fez login no Discourse usando o login do Discord (Assim, o Discord Bot é capaz de corresponder às contas de usuário).

  4. Suporte de localização adicionado para muitos recursos.

Obrigado a @erlend_sh e à equipe do Discourse por especificarem e patrocinarem este trabalho!! :pray:

Mais coisas de bot virão :wink: :robot:

5 curtidas

Se eles fizerem login com autenticação do Discourse ou qualquer autenticação diferente do OAuth do Discord, este plugin simplesmente os ignorará?

1 curtida

Não os ignora, apenas não consegue corresponder o usuário com a pessoa no outro sistema. Como resultado, as mensagens copiadas aparecerão como vindas do “sistema”.

2 curtidas

Threads são suportados?

4 curtidas

Ainda não, Klaus, mas é potencialmente algo que está em desenvolvimento. Estamos aguardando a atualização da API Ruby (bloqueador) e, em seguida, um patrocinador para adicionar esse recurso.

2 curtidas