Sincronizar WooCommerce Subscriptions con servidor de Discord usando un Bot

Si tienes un sitio que maneja suscriptores con el plugin «WooCommerce Subscriptions» y quieres dar privilegios a esos suscriptores en tu servidor de Discord, pues aquí tienes la solución, realizaremos un Bot de Discord que conectará con nuestro WordPress para encargarse del trabajo.

Primero debes tener en cuenta que necesitaras:

  • NodeJS instalado
  • WooCommerce Subscriptions.
  • Un servidor o canal de Discord con un rol especifico para WordPress.
  • Un campo extra en el perfil del usuario dentro de WordPress, donde irá su usuario de Discord.

Este es el código que necesitas para hacer funcionar el Bot de Discord, esta realizado en «JavaScript» para «NodeJS»:

{
  "name": "elgeneralista_bot",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"

  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "discord.js": "^13.7.0",
    "dotenv": "^16.0.1",
    "node-fetch": "^3.2.4",
    "nodemon": "^2.0.16"
  }
}

El archivo que contiene las variables, en este archivo le decimos al Bot donde esta nuestro WordPress y todo lo relacionado con nuestro canal de Discord. Recuerda reemplazar los valores por los tuyos.

BOT_TOKEN=tu_bot_token
BOT_ID=el_id_de_tu_bot
ROLE_SUSCRIPTOR_DISCORD=el_id_del_rol_de_suscriptor
ID_DISCORD_SERVER=el_id_del_canal_de_discord
URL_JSON_MEMBERS=https://tudominio.com/wp-json/elgeneralista_discord/v2/discord_json_members?token=TU_TOKEN

El archivo index es donde figura la lógica del Bot, básicamente se trata de un bucle que verifica el usuario y en caso de ser suscriptor le asigna el rol en Discord.


const http = require('http');
const https = require('https');

require('dotenv').config()
const Discord = require('discord.js')
const client = new Discord.Client({ intents: ["GUILDS", "GUILD_MEMBERS"] });

console.log("bot started!");

client.login(process.env.BOT_TOKEN)

client.on('ready', () => {

console.log("listo pa darle!");
	
	// Get the right server ID
	const guild = client.guilds.cache.get(process.env.ID_DISCORD_SERVER);


	setInterval(function() {


		https.get(process.env.URL_JSON_MEMBERS, (resp) => {
			//console.log("pidiendo datos...");
			let body = '';
				// The whole response has been received. Print out the result.
			    resp.on("data", (chunk) => {
					body += chunk;
				});

				resp.on('end', () => {

				try {

				let  miembros_web = JSON.parse(body);


				guild.members.fetch({cache : false}).then(members=>{
					members.forEach(member =>
					{
						if(process.env.BOT_ID != member.user.id){
							let role = guild.roles.cache.get(process.env.ROLE_SUSCRIPTOR_DISCORD);
							guild.members.fetch(member.user.id).then((discordUser) => {
								if(miembros_web.includes(member.user.username + "#" + member.user.discriminator)){
									if(!discordUser.roles.cache.has(process.env.ROLE_SUSCRIPTOR_DISCORD)){
										discordUser.roles.add(role).catch((err) => {console.log(err)});
									}
								}else{
									if(discordUser.roles.cache.has(process.env.ROLE_SUSCRIPTOR_DISCORD)){
										discordUser.roles.remove(role).catch((err) => {console.log(err)});
									}
								}
							}).catch((err) => {console.log(err)});
						}
					});
				});

			
			
				} catch (error) {
					console.error(error.message);
				};

			});

		}).on("error", (err) => { console.log("Error: " + err.message)});






	}, 3600000);









  });




Con estos 3 archivos dentro de una misma carpeta, accedemos a ella por terminal y ejecutamos lo siguiente para instalar las dependencias:

npm install

Ya podemos ejecutar nuestro Bot dentro de la misma carpeta ejecutando lo siguiente:

npm start

Ahora es el momento de dirigirnos a nuestro WordPress, en el vamos a copiar en nuestro archivo «functions.php» de nuestro theme, o usando algún plugin para la gestión de snippets el siguiente código:

add_action( 'rest_api_init', 'elgeneralista_snippet_registrar_endpoint' );

function elgeneralista_snippet_registrar_endpoint() {
  register_rest_route( 'elgeneralista_discord/v2', '/discord_json_members', array(
    'method' => 'GET',
    'callback' => 'elgeneralista_snippet_listar_discord_usuarios',
  ) );
}


function elgeneralista_snippet_listar_discord_usuarios($request) {

	$pid = 123; //ID de la suscripcion en Woocommerce
	$___token = "TU_TOKEN";
	
	
	$miembros = array();
	
	if($request['token'] == $___token){
		
		
		$users = get_users( array( 'fields' => array( 'ID' ) ) );
		foreach($users as $user){
			//Comprueba que el usuario tenga una suscripcion activa
			if ( wcs_user_has_subscription($user->ID, $pid, 'active')) {
				$discordtag = get_user_meta( $user->ID, 'discordtag');
				if(!empty($discordtag[0])){
					array_push($miembros,$discordtag[0]);
				}
			}
			
		}
		
		
	}


  return json_encode($miembros);
}

En este fragmento debes reemplazar los valores del siguientes variables:

$pid = 123; // int | Este es el ID de la suscripcion de Woocommerce
$___token = "TU_TOKEN"; // string | Este token es un valor asignado por ti para la conexion con el Bot, usa algo complicado!.


//Ejemplo

$pid = 3;
$___token = "que.gu4po_soy-d1os_mi0!";  // 😉

Este snippet creará un punto de acceso a la API REST de WordPress, para que el Bot obtenga las cuentas de usuario de Discord de los suscriptores y les asigne el rol.

Ahora solo te queda que personalices tu servidor de Discord para los usuarios de dicho rol.

Ahora debemos crear un campo personalizado en el perfil de usuario del WordPress, al que llamaremos «discordtag», puedes crearlo utilizando un plugin, yo he empleado JetEngine para tal menester ?.

Si prefieres crear el campo personalizado de usuario sin usar plugins: Snippet campo de usuario personalizado.

Ve a JetEngine/Metaboxes y añade uno nuevo:

Asegúrate de que se trata de un metabox para «User»:

Ahora añade un nuevo meta field con los siguientes valores:

Listo!, ya esta todo preparado.

Este código fue en parte lo que me llevó a empezar con elGeneralista, ya que lo necesité para un proyecto y no encontré nada por ahí que valiera la pena, sobre todo gratis.

Si te sirvió este código comparte nuestro sitio para que la comunidad crezca!, a disfrutar! ?

Este sitio web necesita usar Cookies para funcionar correctamente, ademas de con fines de análisis, publicitario y/o de afiliación. En este enlace dispones de mas información.    Más información
Privacidad