From 676a7db96ef233413896815bcd14d7568e740b43 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fernando=20M=C3=A9ndez?=
<45081533+FerMdez@users.noreply.github.com>
Date: Tue, 2 Feb 2021 11:03:35 +0100
Subject: [PATCH] Add files via upload
---
DiskoBOTlo_Discord/bot.js | 83 +++
DiskoBOTlo_Discord/package.json | 18 +
DiskoBOTlo_Telegram/README.md | 109 +++
DiskoBOTlo_Telegram/bot.js | 1008 ++++++++++++++++++++++++++
DiskoBOTlo_Telegram/package.json | 16 +
FDIeSports_Discord_bot/bot.js | 83 +++
FDIeSports_Discord_bot/package.json | 15 +
FDIeSports_Telegram_bot/README.md | 109 +++
FDIeSports_Telegram_bot/bot.js | 178 +++++
FDIeSports_Telegram_bot/package.json | 15 +
README.md | 11 +
11 files changed, 1645 insertions(+)
create mode 100644 DiskoBOTlo_Discord/bot.js
create mode 100644 DiskoBOTlo_Discord/package.json
create mode 100644 DiskoBOTlo_Telegram/README.md
create mode 100644 DiskoBOTlo_Telegram/bot.js
create mode 100644 DiskoBOTlo_Telegram/package.json
create mode 100644 FDIeSports_Discord_bot/bot.js
create mode 100644 FDIeSports_Discord_bot/package.json
create mode 100644 FDIeSports_Telegram_bot/README.md
create mode 100644 FDIeSports_Telegram_bot/bot.js
create mode 100644 FDIeSports_Telegram_bot/package.json
create mode 100644 README.md
diff --git a/DiskoBOTlo_Discord/bot.js b/DiskoBOTlo_Discord/bot.js
new file mode 100644
index 0000000..f1b08b2
--- /dev/null
+++ b/DiskoBOTlo_Discord/bot.js
@@ -0,0 +1,83 @@
+// Librerías y dependendias:
+const Discord = require("discord.js");
+const client = new Discord.Client();
+const config = require("./config.json");
+const mcping = require('mc-ping-updated');
+
+// Prefijo para comandos "/":
+let prefix = config.prefix;
+
+
+
+// Funciones del bot:
+client.on('ready', () => {
+ // Mensaje al iniciar el bot:
+ console.log("[ " + Date() + " ] Se ha iniciado el bot.");
+
+});
+
+client.on('message', message => {
+ // Ignoramos el contenido de los mensajes del BOT (evita bucle infinito):
+ // if (!message.content.startsWith(prefix)) return;
+ // if (message.author.bot) return;
+
+ // Id del canal de bienvenida:
+ var welcomeChanel = client.channels.cache.get(config.welcomeChanel);
+ // Id del canal de Minecraft:
+ var serverMinecraftChanel = client.channels.cache.get(config.serverMinecraftChanel);
+ //Id del canal de Junta:
+ var juntaChanel = client.channels.cache.get(config.juntaChanel);
+
+ // Id del rol "Suscriptor":
+ //var socioRol = message.guild.roles.cache.find(r => r.name === "socioRol");
+ var socioRol = message.guild.roles.cache.get(config.socioID);
+
+ // Asignación del rol al decir "Hola" en el canal de bienvenida.
+ if(message.channel == welcomeChanel){
+ //console.log(message.content);
+ if(message.content === 'Hola'){
+ if(message.member.roles.cache.has(socioRol.id)) {
+ message.channel.send('Hola a ti también 😉');
+ console.log("[ " + Date() + " ] Se ha interactuado con" + message.member.user.username + " en #BIENVENIDA.");
+ }
+ else {
+ message.member.roles.add(socioRol).catch(console.error); //Agregamos el rol al usuario
+ message.channel.send(message.member.user.username + ' *¡Bienvenido al servidor de Diskobolo!* 👋\n' +
+ '⚠️ Usa los canales adecuados para hablar de cada tema y respeta a los demás ⚠️\n' +
+ '👉 Se te ha asignado el rol: `'+socioRol.name+'` 👈.\n\n' +
+ '🐦 Puedes seguirnos en *twitter* 🐦: https://twitter.com/DSKbolo \n\n' +
+ '🔎 Recuerda la IP del servidor de Minecraft ⛏️: *diskobolo.fdi.ucm.es*\n', { parse_mode: 'Markdown' });
+ console.log("[ " + Date() + " ] Se ha asignado un rol de socioRol a " + message.member.user.username );
+ }
+ } else if(!(message.member.roles.cache.has(socioRol.id))) {
+ message.channel.send(message.member.user.username + ' escribe "Hola", para que se te asigne un rol.');
+ console.log("[ " + Date() + " ] Se ha solicitado a " + message.member.user.username + " que diga hola.");
+ }
+ }
+
+ if(message.channel == juntaChanel || message.channel == serverMinecraftChanel) {
+ if(message.content.startsWith(prefix + 'ping')) {
+ message.channel.send(`pong 🏓`);
+ }
+ if(message.content.startsWith(prefix + 'minecraft')) {
+ mcping('diskobolo.fdi.ucm.es', 25565, function(err, res) {
+ if (err) {
+ // Some kind of error
+ message.channel.send('El servidor *NO* funciona. Puede que haya explotado un creeper 🤷♂️', { parse_mode: 'Markdown' });
+ console.error("[ " + Date() + " ]" + message.member.user.username + "Error al mostrar el estado del servidor de Minecraft.\n\n" + err);
+ } else {
+ // Success!
+ message.channel.send('⛏️*SERVIDOR DE MINECRAFT DE Diskobolo*⛏️ \n\n' +
+ 'Estado: *ACTIVO* \n' +
+ 'IP del servidor: *diskobolo.fdi.ucm.es* \n' +
+ 'Versión del servidor: *' + res.version.name + '* \n' +
+ 'Jugadores conectados: *' + res.players.online +'*', { parse_mode: 'Markdown' });
+ console.log("[ " + Date() + " ]" + message.member.user.username + " Ha solicitado el estado del servidor de Minecraft. \n\n" + res)
+ //console.log(res);
+ }
+ }, 3000);
+ }
+ }
+});
+
+client.login(config.BOT_TOKEN);
\ No newline at end of file
diff --git a/DiskoBOTlo_Discord/package.json b/DiskoBOTlo_Discord/package.json
new file mode 100644
index 0000000..67c35a9
--- /dev/null
+++ b/DiskoBOTlo_Discord/package.json
@@ -0,0 +1,18 @@
+{
+ "name": "DiskoBOTlo",
+ "version": "1.0.0",
+ "description": "Bot de Discord de la Asocación Diskobolo de la Facultad de Informática de la Universidad Complutense de Madrid.",
+ "main": "bot.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "author": "Fernando Méndez (https://fermdez.ddns.net | @HumperCobra)",
+ "license": "Educational Community License v2.0 (ECL-2.0)",
+ "dependencies": {
+ "discord.js": "^12.5.1",
+ "mc-ping-updated": "^0.1.1",
+ "mcping-js": "^1.5.0"
+ },
+ "devDependencies": {},
+ "keywords": []
+}
diff --git a/DiskoBOTlo_Telegram/README.md b/DiskoBOTlo_Telegram/README.md
new file mode 100644
index 0000000..e473cd4
--- /dev/null
+++ b/DiskoBOTlo_Telegram/README.md
@@ -0,0 +1,109 @@
+# DiskoBOTlo_bot 🤖
+
+## Índice
+1. [Descripción](#1-descripción-)
+2. [Autor](#2-autor-%EF%B8%8F)
+3. [Advertencia](#3-advertencia-%EF%B8%8F)
+4. [Generar un token con @BotFather](#4-generar-un-token-con-botfather)
+5. [Ejecución](#5-ejecución-%EF%B8%8F)
+* 5.1. [Instalación _node_modules_](#instalación-node_modules-)
+* 5.2. [Poner el Bot en producción](#poner-el-bot-en-producción-%EF%B8%8F)
+ * 5.2.1. [En Windows](#en-windows-)
+ * 5.2.2. [En Linux](#en-linux-debianubuntu-)
+* 5.3 [Añadir nuevas librerías](#53-añadir-nuevas-librerías-)
+6. [Licencia](#6-licencia-)
+7. [Enlace al Bot](#7-enlace-al-bot-)
+***
+## 1. Descripción 📖
+Bot de Telegram para la Asociación Diskobolo de la Facultad de Informática de la Universidad Complutense de Madrid.
+***
+## 2. Autor ✒️
+Fernando Méndez (https:/fermdez.ddns.net | @HumperCobra)
+***
+## 3. Advertencia ⚠️
+Desbes generar tu propio token para el bot y añadirlo a _const token = 'AQUÍ_A_TU_TOKEN';_ en el archivo *bot.js*.
+***
+## 4. Generar un token con @BotFather
+1. Inicia un chat con https://t.me/botfather
+2. Escribe en el chat el comando */newbot*
+3. Te pedirá el alias y luego el nombre del bot (debe contener la palabra _bot_).
+4. Nos devolverá el token de nuestro bot, por ejemplo:
+
+ > Use this token to access the HTTP API: 668219748:ABCRTZu7zNT5QO2bRfZfbPIXBLXb2U-ojVX
+***
+## 5. Ejecución 🛠️
+### 5.1 Instalación _node_modules_ 🔧
+1. Creamos un directorio para el bot y guardamos ahí el archivo *bot.js*.
+2. Instalar *node.js*
+ * En Windows/Mac: https://nodejs.org/es/download/.
+ * Si tienes Linux (Debian/Ubuntu), usa los siguientes comandos:
+ ```
+ $ sudo apt-get update
+ $ sudo apt-get upgrade
+ $ sudo apt-get install curl
+
+ $ cd ~
+ $ curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
+
+ $ sudo apt-get install -y nodejs
+
+ $ cd ./ruta_del_directorio_del_bot/
+ $ npm install
+ ```
+3. Comprobar que se ha instalado con el comando:
+ ```
+ >/$ node --version
+ ```
+4. Dentro del directorio del bot, ejecutar los siguientes comandos:
+ ```
+ >/$ npm init --yes
+ >/$ npm install --save node-telegram-bot-api
+ ```
+5. Comprobar que se ha generado el directorio _node_modules_.
+### 5.2 Poner el Bot en producción ⚙️
+#### 5.2.1 En Windows 💻
+* Instala *nodejs*, si no lo hiciste en el punto anterior: https://nodejs.org/es/download/
+* Ejecutar en CMD o PS los comandos:
+ ```
+ > cd ./ruta_del_directorio_del_bot/
+ > node bot.js
+ ```
+* El proceso se puede automatizar creando un archivo .bat y añadiéndolo al programador de tareas.
+
+#### 5.2.2 En Linux (Debian/Ubuntu) 🐧
+* Instalamos *nodejs*, si no lo hicimos en el punto anterior:
+ ```
+ $ sudo apt-get update
+ $ sudo apt-get upgrade
+ $ sudo apt-get install curl
+
+ $ cd ~
+ $ curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
+
+ $ sudo apt-get install -y nodejs
+
+ $ cd ./ruta_del_directorio_del_bot/
+ $ npm install
+```
+
+* Ejecutamos el bot con el comando:
+ ```
+ $ node bot.js
+ ```
+
+* El proceso se puede automatizar creando un script.
+
+### 5.3 Añadir nuevas librerías 📚
+* Primero abrir un terminal/PowerShell/CMD (dependiendo de nuestro SO) e ir al directorio de nuestro bot:
+ ```
+ cd ./ruta_del_directorio_del_bot/
+ ```
+* Si por ejemplo queremos añadir la librería _weather-js_, deberemos escribir el siguiente comando:
+ ```
+ npm install weather-js
+ ```
+***
+## 6. Licencia 📄
+Educational Community License v2.0 (ECL-2.0).
+## 7. Enlace al Bot 🤖
+> https://t.me/DiskoBOTlo_BOT
diff --git a/DiskoBOTlo_Telegram/bot.js b/DiskoBOTlo_Telegram/bot.js
new file mode 100644
index 0000000..7db57c0
--- /dev/null
+++ b/DiskoBOTlo_Telegram/bot.js
@@ -0,0 +1,1008 @@
+/*
+{
+ "name": "DiskoboBOTlo",
+ "version": "3.0.0",
+ "description": "Bot de la asociación Diskobolo de la Facultad de Informática de la Universidad Complutense de Madrid.",
+ "main": "bot.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "keywords": [],
+ "author": "Fernando Méndez Torrubiano (https://fermdez.ddns.net | @HumperCobra)",
+ "license": "Educational Community License v2.0 (ECL-2.0)",
+ "dependencies": {
+ "node-telegram-bot-api": "^0.51.0"
+ }
+}
+*/
+/* CONSTANTES */
+
+// Importar las librerías:
+const TelegramBot = require('node-telegram-bot-api');
+const _private = require('./private.js');
+// Token del bot: (const token = 'AQUÍ_TU_TOKEN';)
+const token = _private.token();
+// Create the bot:
+const bot = new TelegramBot(token, {polling:true});
+// ID grupo Diskobolo: (const IDGRUPO = 'AQUÍ_EL_ID_DE_TU_GRUPO';)
+const IDGRUPO = _private.IDGRUPO();
+
+const Telegraf = require('telegraf');
+const Extra = require('telegraf/extra');
+const Markup = require('telegraf/markup');
+const mcping = require('mc-ping');
+const http = require('http');
+const fs = require("fs");
+const curl = require("curl");
+//const OpenWeatherMapHelper = require("openweathermap-node");
+const jsdom = require("jsdom");
+const kelvinToCelsius = require('kelvin-to-celsius');
+var schedule = require('node-schedule');
+var moment = require('moment')
+var nodejsWeatherApp = require('nodejs-weather-app');
+const weather = require('weather-js');
+const { brotliCompress } = require('zlib');
+const { Recoverable } = require('repl');
+const { userInfo } = require('os');
+const keyboard = Markup.inlineKeyboard([
+ Markup.urlButton('❤️', 'http://telegraf.js.org'),
+ Markup.callbackButton('Delete', 'delete')
+])
+const helper = _private.helper();
+/* ---------------------------AÑADIR EN EL ARCHIVO private.js LOS IDs DE LOS ADMINISTRADORES DEL BOT---------------------------*/
+const _admins= _private.admins();
+/* --------------------------------------------------------------------------------------------------------*/
+
+// Palabras reservadas:
+/* -------------------- */
+//PALABRA DISKOBOLO
+const palabradiskobolo = new RegExp(/\b([dD]iskobolo)\b/);
+// PALABRA EXAMEN
+const palabraexamen = new RegExp(/\b([eE]xamen)\b/);
+//PALABRA IRONMAN
+const palabraironman = new RegExp(/\b([iI]ron [mM]an)\b/);
+//PALABRA THANOS
+const palabrathanos = new RegExp(/\b([Tt]hanos)\b/);
+//PALABRA NUCLEAR
+const palabranuclear = new RegExp(/\b([Nn]uclear)\b/);
+//PALABRA LLORO
+const palabralloro = new RegExp(/\b([Ll]loro)\b/);
+//PALABRA PYTHON
+const palabrapython = new RegExp(/\b([Pp]ython)\b/);
+//PALABRA JAVA
+const palabrajava = new RegExp(/\b([Jj]ava)\b/);
+//PALABRA DEBIAN
+const palabradebian = new RegExp(/\b([Dd]ebian)\b/);
+//PALABRA WINDOWS
+const palabrawindows = new RegExp(/\b([Ww]indows)\b/);
+/* -------------------- */
+
+/* *** */
+
+/* VARIABLES */
+var tiempo;
+var usuarios = [];
+var temporaltiempo_usuario = 0;
+var temporaltiempo_fecha = 0;
+var temporaltiempo_comando = false;
+var temporalminecraft_comando = false;
+var temporalminecraft_usuario = 0;
+var temporalminecraft_fecha = 0;
+var temporalsistema_comando = false;
+var temporalsistema_usuario = 0;
+var temporalsistema_fecha = 0;
+var temporalweb_comando = false;
+var temporalweb_usuario = 0;
+var temporalweb_fecha = 0;
+var temporalactividades_comando = false;
+var temporalactividades_usuario = 0;
+var temporalactividades_fecha = 0;
+var sistemas = ['Windows 10', 'Windows 7', 'Windows 8.1', 'Windows 8', 'Debian', 'ArchLinux', 'Ubuntu', 'MS-DOS', 'IBM PC DOS',
+ 'Windows 1.0', 'Windows 2.0', 'Windows 3.0', 'Windows NT', 'Windows 95', 'Windows 98', 'Windows Me', 'Windows XP', 'Windows Vista (El peor SO del mundo)',
+ 'Windows 7', 'Windows 8', 'Windows 8.1', 'Windows 10', 'Windows 10 Lite', 'Windows IOT', 'Windows Phone 7', 'Windows Phone 8', 'Windows Phone 8.1', 'Windows 10 Mobile',
+ 'Mac System Software', 'Mac System Software 1.1', 'Mac System Software 2.0', 'Mac System Software 3.0', 'Mac System Software 4.0', 'Mac System Software 5',
+ 'Mac System Software 6', 'Mac System Software 7', 'Mac OS 7.6', 'Mac OS 8', 'Mac OS 9', 'Mac OS X', 'Mac OS X Puma', 'Mac OS X Jaguar', 'Mac OS X Panther',
+ 'Mac OS X Leopard', 'Mac OS X Snow Leopard', 'Mac OS X Lion', 'Mac OS X Mountain Lion', 'Mac OS X Mavericks', 'Mac OS X Yosemite', 'Mac OS X El capitan',
+ 'Mac OS X Sierra', 'Mac OS X High Sierra', 'Mac OS X Mojave', 'Mac OS X Catalina', 'Manjaro Linux', 'OpenSUSE', 'Ubuntu', 'Debian', 'Linux Mint', 'Raspbian',
+ 'Arch Linux', 'Red Hat Enterprise Linux', 'Fedora', 'CentOS', 'Elementary OS', 'Kali Linux', 'BlackArch Linux', 'HannahMontanaOS', 'NicolasCageOS', 'Lubuntu',
+ 'SteamOS', 'Scientific Linux', 'Linux', 'Android Apple Pie', 'Android Banana Bread', 'Android Cupcake', 'Android Donut', 'Android Eclair', 'Android Froyo',
+ 'Android Gingerbread', 'Android Honeycomb', 'Android Ice Cream Sandwich', 'Android Jelly Bean', 'Android KitKat', 'Android Lolipop', 'Android Marshmallow',
+ 'Android Nougat', 'Android Oreo', 'Android Pie', 'Android 10', 'Android 11', 'iPhone OS 1.0', 'iPhone OS 2.0', 'iPhone OS 3.0', 'iOS 4', 'iOS 5', 'iOS 6', 'iOS 7',
+ 'iOS 8', 'iOS 9', 'iOS 10', 'iOS 11', 'iOS 12', 'iOS 13', 'iOS 14', 'iPad OS', 'CoronavirusOS (disponible por tiempo limitado)'];
+var a = false;
+var search_so = schedule.scheduleJob('00 9 * * *', function () {
+ console.log('¡Acabamos de elegir el sistema de hoy!');
+ sistema = sistemas[Math.floor(Math.random() * sistemas.length)];
+ a = true;
+ bot.sendMessage(IDGRUPO, " ¡BUENOS DÍAS! 🥁️* EL SISTEMA OPERATIVO DE HOY ES... *🥁️ " + "\n" + sistema, { parse_mode: 'Markdown' })
+});
+var aniversario = schedule.scheduleJob('00 00 14 4 *', function () {
+ console.log('¡Hoy es el aniversario de Diskobolo!');
+ bot.sendMessage(IDGRUPO, "¡Hoy es el aniversario de Diskobolo! \n\n" +
+ "La asociación Diskobolo fue fundada el 14 de Abril de 1992 y es la asociación más antigüa de la Facultad de Informática.", { parse_mode: 'Markdown' })
+});
+var sistema;
+// ACTIVIDADES:
+var cmp = 0;
+var aux = 0;
+var html = 0;
+const url = "https://diskobolo.fdi.ucm.es/#actividades";
+curl.get(url, null, (err, resp, body) => {
+ if (resp.statusCode == 200) {
+ html = body;
+ }
+ else {
+ //some error
+ ling
+ console.log("error while fetching url");
+ }
+});
+/* *** */
+
+/* ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */
+
+/* FUNCIONALIDADES */
+// Captura de errores:
+bot.on('polling_error', function(error){
+ // Descomentar para trazar errores en el log.
+ //console.log(error);
+});
+
+// Inicio del bot:
+bot.onText(/^\/start/, function(msg){
+ var chatId = msg.chat.id;
+ var nameUser = msg.from.first_name;
+ var userId = msg.from.id;
+ var date = msg.date;
+
+ bot.sendMessage(chatId, "¡Hola *" + nameUser +"*! " +
+ "¿Me has llamado verdad? 😊️\n\nSoy el bot de Diskóbolo, algunos me conocen como el *DiskoBOTlo* aunque me han programado para... ¡Darte la bienvenida!😎️" +
+ "\n\nEstaré aquí para lo que necesites. 💪️" +
+ "\n\n¿En qué te puedo ayudar? \nDejame pensar... 🤔️ escribe */comandos* para ver todo lo que puedo hacer. 🙃", {parse_mode : "Markdown"});
+
+ console.log("[" + Date(date) + "] " + nameUser + " (" + userId + "): Ha iniciado el bot.");
+
+ menu(msg);
+});
+
+// Llama al menú interactivo de ayuda:
+bot.onText(/^\/comandos/, (msg) => {
+ menu(msg);
+});
+
+// Llama al menú interactivo de ayuda:
+bot.onText(/^\/help/, (msg) => {
+ getHelp(msg);
+ });
+
+// Comando para mostrar las redes sociales de DSK:
+bot.onText(/^\/rrss/, (msg) => {
+ getRedes(msg);
+});
+bot.onText(/^\/redes/, (msg) => {
+ getRedes(msg);
+});
+
+// Comando para mostrar próximas actividades:
+bot.onText(/^\/actividades/, (msg) => {
+ getActividades(msg);
+});
+
+// Comando para mostrar el estado de la web:
+bot.onText(/^\/web/, (msg) => {
+ getWeb(msg);
+});
+
+// Comando para mostrar el estado del servidor de Minecraft:
+bot.onText(/^\/minecraft/, (msg) => {
+ getMinecraft(msg);
+});
+
+// Comando para mostrar el Sistema Operativo del día:
+bot.onText(/^\/sistemadeldia/, (msg) => {
+ getSistemadeldia(msg);
+});
+
+// Comando para mostrar la localización del despacho 111:
+bot.onText(/^\/despacho/, (msg) => {
+ getDespacho(msg);
+});
+
+// Comando para mostrar el clima en la FDI:
+bot.onText(/^\/weather/, (msg) => {
+ getClima(msg);
+});
+bot.onText(/^\/clima/, (msg) => {
+ getClima(msg);
+});
+
+//Comando para mostar las opciones de administradores:
+bot.onText(/^\/admin/, (msg) => {
+ admin(msg);
+});
+
+// Autor:
+bot.onText(/^\/autor/, function(msg){
+ var chatId = msg.chat.id;
+ var nameUser = msg.from.first_name;
+ var userId = msg.from.id;
+ var date = msg.date;
+
+ bot.sendMessage(chatId, "Autor👤: *Fernando Méndez 'Humpercobra'* \n" +
+ "Web🌐: https://fermdez.ddns.net", {parse_mode : "Markdown"});
+
+ console.log("[" + Date(date) + "] " + nameUser + " (" + userId + "): Ha solicitado el autor.");
+});
+
+/* Funcionalidades de Administradores: */
+//ENVIAR
+bot.onText(/^\/enviar/, function(msg){
+ enviarComunidado(msg)
+ });
+ // Muestra el id del usuario que hace la petición:
+ bot.onText(/^\/myid/, function(msg){
+ getMyId(msg);
+ });
+
+ // Respuesta de comprobación del bot:
+ bot.onText(/^\/ping/, function(msg){
+ doPing(msg);
+ });
+
+ // Envía el himno de Diskobolo:
+ bot.onText(/^\/himno/, function(msg){
+ getHimno(msg);
+ });
+
+// Muestra los Estatutos y reglamento del régimen interno:
+bot.onText(/^\/estatutos/, function(msg){
+ getEstatutos(msg);
+});
+
+
+/* Pruebas: */
+// Envía un dado:
+bot.onText(/^\/dado/, function(msg) {
+ getDado(msg);
+});
+//Envía un dardo
+bot.onText(/^\/dardo/, function(msg) {
+ getDardo(msg);
+});
+//Envía un balón
+bot.onText(/^\/ball/, function(msg) {
+ getBall(msg);
+ });
+
+
+/* ------------------------------------------------------------------------------------------------------ */
+/* No añadas funcionalidades debajo de aquí, no funcionarán (pero sí puedes añadir funciones, más abajo). */
+
+// Detección de palabras reservadas:
+bot.on('message', (msg) => {
+ var mensaje = msg.text;
+
+ //Si entra al grupo un nuevo usuario:
+ if (msg.new_chat_members != undefined){
+ getMensajeBienvenida(msg);
+ //bot.sendMessage(chatId, "Hola " + nameNewMember + ", bienvenido al grupo " + chatitle);
+ } //Cuando un usuario abandona el grupo
+ else if (msg.left_chat_member != undefined){
+ getMensajeDespedida(msg);
+ //bot.sendMessage(chatId, nameLeftMember + " abandonó el grupo");
+ }
+
+ if(mensaje.includes('diskobolo') || mensaje.includes('Diskobolo')){
+ bot.sendMessage(msg.chat.id, "Diskoporro*");
+ }
+ if(mensaje.includes('iron man') || mensaje.includes('Iron Man')
+ || mensaje.includes('ironman') || mensaje.includes('IronMan')
+ || mensaje.includes('Iron man') || mensaje.includes('Ironman')){
+ bot.sendAudio(msg.chat.id,"./src/audio/ironman.mp3",{caption : "Y yo... soy Iron Man."});
+ }
+ if(mensaje.includes('thanos') || mensaje.includes('Thanos')){
+ bot.sendAudio(msg.chat.id,"./src/audio/thanos.mp3",{caption : "Yo soy INEVITABLE."});
+ }
+ if(mensaje.includes('nuclear') || mensaje.includes('Nuclear')){
+ bot.sendAudio(msg.chat.id,"./src/audio/nucelar.mp3",{caption : "Nucelar, la palabra es nucelar."});
+ }
+ if(mensaje.includes('examen') || mensaje.includes('Examen')){
+ bot.sendMessage(msg.chat.id, "Parece que intentas suicidarte, ¿necesitas ayuda? 🙃");
+ }
+ if(mensaje.includes('lloro') || mensaje.includes('Lloro')){
+ bot.sendMessage(msg.chat.id, msg.chat.first_name + " deja de llorar.");
+ }
+ if(mensaje.includes('windows') || mensaje.includes('Windows')){
+ bot.sendMessage(msg.chat.id, "¡Windows días! 🪟");
+ }
+ if(mensaje.includes('debian') || mensaje.includes('Debian')){
+ bot.sendMessage(msg.chat.id, "Hola caracola 🐚");
+ }
+ if(mensaje.includes('java') || mensaje.includes('Java')){
+ bot.sendMessage(msg.chat.id, "Intenté ligar con una informática, pero no sé deJAVA (ba dum chss...)");
+ }
+ if(mensaje.includes('python') || mensaje.includes('Python')){
+ bot.sendMessage(msg.chat.id, "Ha dicho Python 🤮");
+ }
+});
+
+/* *** */
+
+
+
+
+/* ------------------------------------------------------------------------------------------------------ */
+/* FUNCIONES */
+
+//Mensaje de bienvenida al entrar en el grupo de Diskobolo:
+function getMensajeBienvenida(msg) {
+ //var nameUser = msg.from.first_name;
+ //var chatitle = msg.chat.title;
+ var chatId = msg.chat.id;
+ var nameNewMember = msg.new_chat_member.first_name;
+ var date = msg.date;
+
+ if (msg.new_chat_member.is_bot == true){
+ bot.sendMessage(chatId, "🔏️ *Bienvenido a Diskóbolo, " + nameNewMember + "* 🔓️. \nSé que eres otro bot, te estoy vigilando 👀", {parse_mode: 'Markdown'});
+ console.log(nameNewMember + ": Ha entrado al grupo.");
+ }
+ else {
+ bot.sendMessage(chatId, "🔏️ *Bienvenido a Diskóbolo, " + nameNewMember + "*. \nSoy el DiskoBotlo 🔓️" +
+ "\nEstamos deseando verte por el *despacho 111* (primera planta)." +
+ "\n\n- Siguenos en *Twitter*: [Twitter](https://www.twitter.com/dskbolo) \n- Visita nuestra *web*: [Web](http://diskobolo.fdi.ucm.es) \n" +
+ "\n-*Y si aún no eres socio, registrate con tu cuenta UCM*, a través de este enlace: https://forms.gle/4Y7cNZu3yTx5FKyUA \n", { parse_mode: 'Markdown' });
+ console.log("[" + Date(date) + "] " + nameNewMember + ": Ha entrado al grupo.");
+ }
+}
+
+//Mensaje de despedida al salir del grupo de Diskobolo:
+function getMensajeDespedida(msg) {
+ var chatId = msg.chat.id;
+ //var chatitle = msg.chat.title;
+ var nameLeftMember = msg.left_chat_member.first_name;
+ var date = msg.date;
+
+ bot.sendMessage(chatId, "*" + nameLeftMember + "* abandonó el grupo. Te echaremos de menos ❤️", {parse_mode: 'Markdown'});
+ console.log("[" + Date(date) + "] " + nameUser + ": Ha abandonado el grupo");
+}
+
+// Menú interactivo de ayuda:
+function menu(msg){
+ var chatId = msg.chat.id;
+ //var userName = msg.from.first_name;
+ //var tipoChat = msg.chat.type;
+
+ bot.sendMessage(chatId, "Selecciona una opción: \n\n(Escribe /comandos para volver a mostrar este menú o /help para mostrar la descripción de cada comando). ",
+ {
+ reply_markup: {
+ inline_keyboard: [
+ [
+ {
+ text:"Redes Sociales 💙", callback_data: 'redes',
+ }
+ ],
+ [
+ {
+ text:"Próximas actividades 📅", callback_data: 'actividades',
+ }
+ ],
+ [
+ {
+ text:"Estado de la página web 🌍️", callback_data: 'web',
+ },
+ {
+ text:"Servidor de Minecraft ⛏", callback_data: 'minecraft',
+ }
+ ],
+ [
+ {
+
+ text:"Sistema Operativo del día 💻", callback_data: 'so',
+ }
+ ],
+ [
+ {
+ text:"Localización Despacho 📍", callback_data: 'despacho',
+ },
+ {
+
+ text:"Clima en la FDI ⛅", callback_data: 'weather',
+ }
+ ],
+ [
+ {
+ text:"Enviar un dado🎲", callback_data: 'dado',
+ },
+ {
+
+ text:"Enviar un dardo🎯", callback_data: 'dardo',
+ },
+ {
+ text:"Enviar un balón⚽️", callback_data: 'ball',
+ }
+ ],
+ [
+ {
+ text:"Comandos de administradores 🛡️",callback_data: 'admin',
+ }
+ ],
+ ]
+ },
+ parse_mode:"HTML",
+ });
+ console.log("[" + Date(msg.date) + "] " + msg.from.first_name + "(" + msg.from.id + "): Ha usado el comando /comandos.");
+}
+
+// Respuestas a la pulsación de botones:
+bot.on('callback_query', function onCallbackQuery(accionboton){
+ const data = accionboton.data;
+ const msg = accionboton.message;
+
+ switch(data){
+ case 'redes': getRedes(accionboton);
+ break ;
+ case 'actividades': getActividades(accionboton);
+ break ;
+ case 'minecraft': getMinecraft(accionboton);
+ break ;
+ case 'web': getWeb(accionboton);
+ break ;
+ case 'so': getSistemadeldia(accionboton);
+ break ;
+ case 'despacho': getDespacho(accionboton);
+ break ;
+ case 'weather': getClima(accionboton);
+ break ;
+ case 'admin': admin(accionboton);
+ break ;
+ case 'dado': getDado(accionboton);
+ break ;
+ case 'dardo': getDardo(accionboton);
+ break ;
+ case 'ball': getBall(accionboton);
+ break ;
+ case 'estatutos': sendEstatutos(msg);
+ break;
+ case 'reglamento': sendReglamento(msg);
+ break;
+ }
+
+});
+
+// Muestra la lista de comandos disponibles:
+function getHelp(msg){
+ bot.sendMessage(msg.chat.id, "¡Estos son todos los comandos que puedes usar! 😱️\n\n" +
+ "/actividades - ¡Descubre todas las *actividades que tenemos pendientes* antes del fin del mundo! 🌍️📅 \n\n" +
+ "/ball - Envía un *balón*. ⚽️🏀 \n\n" +
+ "/comandos - Muestra el menú de comandos. 📋🖨️ \n\n" +
+ "/dado - Envía un *dado*. 🎲 \n\n" +
+ "/dardo - Envía un *dardo*. 🎯 \n\n" +
+ "/despacho - *¿No sabes dónde está nuestro bunker?* Con este comando lo averigüarás. 📍🌍️ \n\n" +
+ "/help - Muestra la información de cada comando. 📑🖨️ \n\n" +
+ "/minecraft - Comprueba el *estado de nuestro servidor de Meincraff*, debería estar abierto durante 1000 años ⛏🧱 \n\n" +
+ "/rrss - Todas las *redes sociales de Diskobolo*. 🕊️📷 \n\n" +
+ "/sistemadeldia - ¿Quemando ISOs todo el día? 😥️ *¡Te ayudamos a elegir el sistema todos los días!* 😜️ \n\n" +
+ "/weather - Muestra el *clima actual en Ciudad Universitaria*. 🌞⛅ \n\n" +
+ "/web - ¿Quieres saber si Chema Alonso ha hackiado tu internete y por eso no te carga nuestra web? 😱️ ¡Nosotros lo comprobamos por ti! 😊️ \n\n" +
+ "/autor - Muestra información sobre el autor. ✍️👱♂️ \n\n" +
+ "/admin - Comandos disponibles para *administradores*. 🛡️🛡️" +
+ "\n\n-------------------------\n\n¿Se te ocurre algo más en lo que crees que puedo ayudarte? 🤯️ \n\n" +
+ "*¡PÁSATE POR EL DESPACHO 111!* Estaremos encantados de ayudarte 😊️ \n\n", {parse_mode : "Markdown"});
+
+ console.log("[" + Date(msg.date) + "] " + msg.from.first_name + "(" + msg.from.id + "): Ha usado el comando /help.");
+}
+
+// Muestra las redes sociales de FDIeSports:
+function getRedes(msg){
+ var userName = msg.from.first_name;
+ var userId = msg.from.id;
+ if(msg.text == '/redes' || msg.text == '/rrss'
+ || msg.text == '/redes@DiskoBOTlo_BOT' || msg.text == '/rrss@DiskoBOTlo_BOT'){
+ var chatId = msg.chat.id;
+ var date = msg.date;
+ }
+ else {
+ var chatId = msg.message.chat.id;
+ var date = msg.message.date;
+ }
+ const keyboard = {
+ reply_markup: {
+ inline_keyboard: [
+ [
+ {
+ text:"Web🌐", url:"https://diskobolo.fdi.ucm.es/"
+ },
+ {
+ text:"Twitter🕊️", url:"https://twitter.com/DskBolo"
+ }
+ ],
+ [
+ {
+ text:"Instagram📷", url:"https://www.instagram.com/diskobolo/"
+ },
+ {
+ text:"Facebook👍", url:"https://www.facebook.com/DiskoboloUCM/"
+ }
+ ],
+ [
+ {
+ text:"YouTube🎥", url:"https://www.youtube.com/channel/UC-zaEabLK02ctakxUkE8Zwg"
+ },
+ {
+ text:"Twitch🔴", url:"https://www.twitch.tv/diskobolo"
+ }
+ ],
+ ]
+ },
+ parse_mode:"HTML",
+ };
+
+ bot.sendMessage(chatId, "" + userName + ", estas son las redes sociales de Diskobolo:",keyboard);
+ console.log("[" + Date(date) + "] " + userName + "(" + userId + "): Ha usado el comando /redes.");
+}
+
+// Muestra las próximas actividades de Dsikobolo:
+function getActividades(msg){
+ // Esta función no ha podido ser liberada por razones de seguridad y privacidad de la asociación.
+}
+
+//Funciones para mostrar el estado del servidor de Minecraft:
+function getMinecraft(msg){
+ getJugadores(msg);
+}
+// Muestra los jugadores conectados al servidor de Minecraft:
+function getJugadores(msg) {
+ // Esta función no ha podido ser liberada por razones de seguridad y privacidad de la asociación.
+}
+
+// Devuelve el estado de la web de Diskobolo:
+function getWeb(msg){
+ // Esta función no ha podido ser liberada por razones de seguridad y privacidad de la asociación.
+}
+
+// Devuelve el sistema operativo del día:
+function getSistemadeldia(msg){
+ var userId = msg.from.id;
+ var userName = msg.from.first_name;
+ if(msg.text == '/sistemadeldia' || msg.text == '/sistemadeldia@DiskoBOTlo_BOT'
+ || msg.text == '/so' || msg.text == '/so@DiskoBOTlo_BOT'){
+ var chatId = msg.chat.id;
+ var msgId = msg.message_id;
+ var msgDate= msg.date;
+ }
+ else {
+ var chatId = msg.message.chat.id;
+ var msgId = msg.message.message_id;
+ var msgDate = msg.message.date;
+ }
+
+ if (userId == temporalsistema_usuario) {
+ console.log(userName + "(" + userId + "): Ha usado el comando /sistemadeldia.");
+ if ((msgDate) > (temporalsistema_fecha + 10) || (msgDate) == (temporalsistema_fecha)) {
+ if (a == false) {
+ sistema = sistemas[Math.floor(Math.random() * sistemas.length)];
+ a = true;
+ }
+ bot.sendMessage(chatId, userName + ", 🥁️*¡EL SISTEMA OPERATIVO DE HOY ES.... *🥁️ " + "\n" + sistema, { parse_mode: 'Markdown'});
+ console.log("[" + Date(msgDate) + "] " + userName + "(" + userId + "): Ha usado el comando /sistemadeldia.");
+ } else {
+ bot.sendMessage(userId, userName + ", espera y vuelve a intentarlo más tarde.")
+ bot.deleteMessage(chatId, msgId);
+ temporalsistema_fecha = msgDate;
+ }
+ } else {
+ if ((msgDate) > (temporalsistema_fecha + 10) || (msgDate) == (temporalsistema_fecha)) {
+ if (a == false) {
+ sistema = sistemas[Math.floor(Math.random() * sistemas.length)];
+ a = true;
+ }
+ bot.sendMessage(chatId, userName + ", 🥁️*¡EL SISTEMA OPERATIVO DE HOY ES.... *🥁️ " + "\n" + sistema, { parse_mode: 'Markdown'});
+ }
+ temporalsistema_usuario = userId;
+ temporalsistema_fecha = msgDate;
+ console.log("[" + Date(msgDate) + "] " + userName + "(" + userId + "): Ha usado el comando /sistemadeldia.");
+ }
+ temporalsistema_comando = true;
+}
+
+function getDespacho(msg){
+ var userName = msg.from.first_name;
+ var userId = msg.from.id;
+ if(msg.text == '/despacho' || msg.text == '/localizacion'
+ || msg.text == '/despacho@DiskoBOTlo_BOT' || msg.text == '/localizacion@DiskoBOTlo_BOT'){
+ var chatId = msg.chat.id;
+ var date = msg.date;
+ }
+ else {
+ var chatId = msg.message.chat.id;
+ var date = msg.message.date;
+ }
+ bot.sendMessage(chatId, "*"+ userName + "*" + ", esta es la localización del *despacho 111*. ", {parse_mode: 'Markdown'});
+ bot.sendLocation(chatId, 40.45304029714122, -3.733060461650645);
+ console.log("[" + Date(date) + "] " + userName + "(" + userId + "): Ha usado el comando /despacho.");
+}
+
+// Muestra la temperatura y el clima en Ciudad universitaria:
+function getClima(msg){
+ var userName = msg.from.first_name;
+ var userId = msg.from.id;
+ if(msg.text == '/weather' || msg.text == '/clima'
+ || msg.text == '/weather@DiskoBOTlo_BOT' || msg.text == '/clima@DiskoBOTlo_BOT'){
+ var chatId = msg.chat.id;
+ var date = msg.date;
+ }
+ else {
+ var chatId = msg.message.chat.id;
+ var date = msg.message.date;
+ }
+ var ciudad = 'Madrid/Moncloa';
+
+ var opciones = {
+ search: ciudad, // lugar es la ciudad que el usuario introduce
+ degreeType: 'C', // Celsius
+ lang: 'es-ES' // Lenguaje en el que devolverá los datos
+ }
+
+ weather.find(opciones, function(err, result){
+
+ if (err){ // Si ocurre algun error...
+ console.log(err); // ... nos lo muestra en pantalla
+
+ } else {
+ console.log("[" + Date(date) + "] " + userName + "(" + userId + "): Ha usado el comando /clima.");
+ console.log(result[0]); // Visualizamos el primer resultado del array
+
+ bot.sendMessage(chatId, "*" + userName + "*" + ", esta es la información del tiempo: \n" +
+ "-------------------------------------------\n" +
+ "Lugar: " + "*" + result[0].location.name + "*" +
+ "\n\nTemperatura: " + "*" + result[0].current.temperature + "ºC\n" + "*" +
+ "Visibilidad: " + "*" + result[0].current.skytext + "\n" + "*" +
+ "Humedad: " + "*" + result[0].current.humidity + "%\n" + "*" +
+ "Dirección del viento: " + "*" + result[0].current.winddisplay + "\n" + "*"
+ ,{parse_mode: 'Markdown'});
+
+ }
+ });
+}
+
+//Devuelve un dado:
+function getDado(msg){
+ var userName = msg.from.first_name;
+ var userId = msg.from.id;
+ if(msg.text == '/dado' || msg.text == '/dado@DiskoBOTlo_BOT'){
+ var chatId = msg.chat.id;
+ var date = msg.date;
+ }
+ else {
+ var chatId = msg.message.chat.id;
+ var date = msg.message.date;
+ }
+
+ bot.sendMessage(chatId, "*" + userName + "*, envió un lanzó.", {parse_mode: 'Markdown'});
+ bot.sendDice(chatId).then(function (info) {
+ console.log(info);
+ console.log("[" + Date(date) + "] " + userName + "(" + userId + "): Ha usado el comando /dado.");
+ });
+}
+
+function getDardo(msg){
+ var userName = msg.from.first_name;
+ var userId = msg.from.id;
+ if(msg.text == '/dardo' || msg.text == '/dardo@DiskoBOTlo_BOT'){
+ var chatId = msg.chat.id;
+ var date = msg.date;
+ }
+ else {
+ var chatId = msg.message.chat.id;
+ var date = msg.message.date;
+ }
+ const opts = {
+ 'emoji': '🎯'
+ }
+ bot.sendMessage(chatId, "*" + userName + "*, lanzó un dardo.", {parse_mode: 'Markdown'});
+ bot.sendDice(chatId, opts).then(function (info) {
+ console.log(info);
+ console.log("[" + Date(date) + "] " + userName + "(" + userId + "): Ha usado el comando /dardo.");
+ });
+}
+
+function getBall(msg){
+ var userName = msg.from.first_name;
+ var userId = msg.from.id;
+ if(msg.text == '/ball' || msg.text == '/balon' || msg.text == '/ball@DiskoBOTlo_BOT'){
+ var chatId = msg.chat.id;
+ var date = msg.date;
+ }
+ else {
+ var chatId = msg.message.chat.id;
+ var date = msg.message.date;
+ }
+ var ball = Math.floor(Math.random() * 2);
+ console.log(ball);
+ switch(ball){
+ case 0:
+ var opts = {
+ 'emoji': '⚽️'
+ }
+ break;
+ case 1:
+ var opts = {
+ 'emoji': '🏀'
+ }
+ break;
+ }
+ bot.sendMessage(chatId, "*" + userName + "*, lanzó una pelota.", {parse_mode: 'Markdown'});
+ bot.sendDice(chatId, opts).then(function (info) {
+ console.log(info);
+ console.log("[" + Date(date) + "] " + userName + "(" + userId + "): Ha usado el comando /ball.");
+ });
+}
+
+
+/*FUNCIONES DE ADMINISTRADORES*/
+function admin(msg) {
+ var userName = msg.from.first_name;
+ var userId = msg.from.id;
+ if(msg.text == '/admin' || msg.text == '/admin@DiskoBOTlo_BOT'){
+ var chatId = msg.chat.id;
+ var tipoChat = msg.chat.type;
+ var date = msg.date;
+ }
+ else {
+ var chatId = msg.message.chat.id;
+ var tipoChat = msg.message.chat.type;
+ var date = msg.message.date;
+ }
+
+ if (getpermisos(msg)) {
+ if (tipoChat == 'private'){
+ bot.sendMessage(chatId, "Bienvenido a la sala de máquinas de Diskóbolo. \n ¿Qué quieres saber? \n\n" +
+ 'Comandos disponibles: \n\n 1. El bot envia un mensaje por el grupo. \n *Solo debe ser empleado para comunicados oficiales con autorización previa del presidente.* \n Uso: _/enviar "Texto, no son necesarias las comillas."_ \n\n' +
+ '2. Comprobar que el bot funciona correctamente. \n *No sirve para nada.* \n Uso: _/ping "Debe devolver: Pong 🏓"_ \n\n' +
+ '3. Obtener tu id de usuario. \n *Para añadir administradores del bot que puedan acceder a estos comandos (lo pueden usar NO administradores, para que su función tenga sentido).* \n Uso: _/myid "Delvolverá un id de usuario que debe añadirse a la constante "admins" (línea 14), del archivo "private.js" del servidor de Diskobolo."_ \n\n' +
+ '4. Enviar el himno *AL GRUPO DE DISKOBOLO*. \n *Para escuchar antes de comenzar las juntas de socios.* \n Uso: _/himno "Devuelve un archivo de audio con el himno de DSK." _ \n\n' +
+ '5. Consultar los *estatutos* y *reglamento del régimen interno*. \n *Envía un documento con el PDF seleccionado de la asociación.* \n Uso: _/estatutos "Te dará a aelegir entre uno de los dos codumentos."_ \n\n'
+ , { parse_mode: 'Markdown' });
+
+ }
+ else if (tipoChat == 'supergroup' || tipoChat == 'group') {
+ bot.sendMessage(chatId, userName + ", este comando sólo funciona en privado.");
+ }
+ }
+ else {
+ bot.sendMessage(chatId, "Lo siento " + userName + ", no eres administrador.");
+ }
+ console.log("[" + Date(date) + "] " + userName + "(" + userId + "): Ha usado el comando /admin.");
+}
+
+// CÓDIGOS DE PERMISOS PARA ADMINISTRADOR [AÑADIR SÓLO ID DE TELEGRAM DE GENTE DE JUNTA]
+function getpermisos(msg) {
+ var userId = msg.from.id;
+ var nameUser = msg.from.first_name;
+ if(msg.text == 'Selecciona una opción: \n'){
+ if (msg.text.includes('/enviar') || msg.text.includes('/enviar@DiskoBOTlo_BOT')){
+ var chatId = msg.chat.id;
+ }
+ } else {
+ if(msg.text == '/admin' || msg.text == '/admin@DiskoBOTlo_BOT'
+ || msg.text == '/ping' || msg.text == '/ping@DiskoBOTlo_BOT'
+ || msg.text == '/estatutos' || msg.text == '/estatutos@DiskoBOTlo_BOT'){
+ var chatId = msg.chat.id;
+ var date = msg.date;
+ }
+ else {
+ var chatId = msg.message.chat.id;
+ var date = msg.message.date;
+ }
+ }
+ var admin = false;
+ var i = 0;
+
+ while(!admin && i < _admins.length){
+ if(userId == _admins[i]){
+ admin = true
+ }
+ i++;
+ }
+
+ if (admin) { //(chatId == 505923437) /* President Fer (Aka Humper) */ || (chatId == 913161860) /*ViceCulo Aaron (Aka Abstención)*/ || (chatId == 960116266 /* Secre lago */)
+ console.log("[" + Date(date) + "] " + "Admin loggued, chat ID: " + chatId);
+ return true;
+ } else {
+ console.log("[" + Date(date) + "] " + "No admin try, ID/USER: " + userId + " | " + nameUser);
+ bot.sendMessage(chatId, "Error 404, admin not found.");
+ return false;
+ }
+}
+
+// Envía y ancla un mensaje al grupo de Diskobolo:
+function enviarComunidado(msg){
+ var comunicado = "";
+ var mensaje = msg.text;
+ var tipoChat = msg.chat.type;
+ var userId = msg.from.id;
+ var nameUser = msg.from.first_name;
+ var date = msg.date;
+
+ if (tipoChat == 'private'){
+ if (getpermisos(msg)) {
+ for(var i = 7; i < mensaje.length; i++){
+ comunicado += mensaje[i];
+ }
+ bot.sendMessage(IDGRUPO, comunicado).then(function(m) {
+ bot.pinChatMessage(IDGRUPO, m.message_id);
+ console.log("[" + Date(date) + "] " + "Un administrador envió un mensaje, " + nameUser + " ID: " + userId);
+ })
+ bot.deleteMessage(msg.chat.id, msg.message_id);
+ }
+ }
+ else if (tipoChat == 'supergroup' || tipoChat == 'group') {
+ bot.sendMessage(chatId, "Este comando sólo funciona en privado.");
+ }
+}
+
+// Muestra el id del usuario que hace la petición:
+function getMyId(msg) {
+ var myId = msg.from.id;
+ var userName = msg.from.first_name;
+ var chatId = msg.chat.id;
+ var tipoChat = msg.chat.type;
+ var date = msg.date;
+
+ if (tipoChat == 'private'){
+ bot.sendMessage(chatId, "Tu id es: " + myId);
+ console.log("[" + Date(date) + "] " + userName + "(" + myId + "): Ha usado el comando /myid.");
+ }
+ else if (tipoChat == 'supergroup' || tipoChat == 'group') {
+ bot.sendMessage(chatId, "Este comando sólo funciona en privado.");
+ }
+}
+
+// Hace un ping:
+function doPing(msg){
+ var chatId = msg.chat.id;
+ var tipoChat = msg.chat.type;
+ var userName = msg.from.first_name;
+ var userId = msg.from.id;
+ var date = msg.date;
+
+ if (getpermisos(msg)){
+ if (tipoChat == 'private'){
+ bot.sendMessage(chatId, "Pong 🏓");
+ console.log("[" + Date(date) + "] " + userName + "(" + userId + "): Ha usado el comando /ping.");
+ }
+ else if (tipoChat == 'supergroup' || tipoChat == 'group') {
+ bot.sendMessage(chatId, "Este comando sólo funciona en privado.");
+ }
+ }
+}
+
+//Envía el himno de DSK:
+function getHimno(msg){
+ var chatId = msg.chat.id;
+ //var tipoChat = msg.chat.type;
+ var userName = msg.from.first_name;
+ var userId = msg.from.id;
+ var date = msg.date;
+
+ if (getpermisos(msg)) {
+ bot.sendAudio(IDGRUPO,"./src/audio/himnoDSK.mp3",{caption: "Himno oficial de DSK (sustituir 'In the navy' por 'Diskoporro')."});
+ console.log("[" + Date(date) + "] " + userName + "(" + userId + "): Ha usado el comando /himno.");
+ }
+ else {
+ bot.sendMessage(chatId, "Lo siento " + userName + ", no eres administrador.");
+ }
+}
+// Encía los estatutos y reglamento del régimen interno de Diskobolo:
+function getEstatutos(msg){
+ var chatId = msg.chat.id;
+ var tipoChat = msg.chat.type;
+ var userName = msg.from.first_name;
+
+ if (getpermisos(msg)) {
+ if (tipoChat == 'private'){
+ bot.sendMessage(chatId, "Selecciona una opción: \n\n(Recuerda que los estatutos son como 'la constitución' y el reglamento como 'las leyes'. \nEl reglamento no puede contradecir los estatutos).",
+ {
+ reply_markup: {
+ inline_keyboard: [
+ [
+ {
+ text:"Estatutos", callback_data: 'estatutos',
+ },
+ {
+ text:"Reglamento del Régimen Interno", callback_data: 'reglamento',
+ }
+ ]
+ ]
+ },
+ parse_mode:"HTML",
+ });
+ }
+ else if (tipoChat == 'supergroup' || tipoChat == 'group') {
+ bot.sendMessage(chatId, "Este comando sólo funciona en privado.");
+ }
+
+ }
+ else {
+ bot.sendMessage(chatId, "Lo siento " + userName + ", no eres administrador.");
+ }
+}
+
+function sendEstatutos(msg){
+ var chatId = msg.chat.id;
+ var userId = msg.from.id;
+ var userName = msg.from.first_name;
+ var date = msg.date;
+
+ bot.sendDocument(chatId, "./src/documents/Estatutos_Diskobolo.pdf",{caption: "Estatutos de la Asociación Diskobolo."});
+ console.log("[" + Date(date) + "] " + userName + "(" + userId + "): Ha solicitado los estatutos.");
+}
+
+function sendReglamento(msg){
+ var chatId = msg.chat.id;
+ var userId = msg.from.id;
+ var userName = msg.from.first_name;
+ var date = msg.date;
+
+ bot.sendDocument(chatId, "./src/documents/Reglamento_del_Régimen_interno_DSK_v2019.pdf",{caption: "Reglamento del régimen interno de la Asociación Diskobolo."});
+ console.log("[" + Date(date) + "] " + userName + "(" + userId + "): Ha solicitado el reglamento del régimen interno.");
+}
+
+/* *** */
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+// Detección de palabras reservadas (OLD):
+/*
+bot.onText(palabradiskobolo, function(msg){
+ bot.sendMessage(msg.chat.id, "Diskoporro*");
+});
+bot.onText(palabraexamen, function(msg){
+ bot.sendMessage(msg.chat.id, "Parece que intentas suicidarte, ¿necesitas ayuda? 🙃");
+});
+bot.onText([palabraironman, 'IRONMAN', 'ironman', 'IronMan', 'IRON MAN'], function(msg){
+ bot.sendAudio(msg.chat.id,"",{caption : "Y yo... soy Iron Man."});
+});
+bot.onText([palabrathanos, 'THANOS'], function(msg){
+ bot.sendAudio(msg.chat.id,"",{caption : "Yo soy INEVITABLE."});
+});
+bot.onText(palabranuclear, function(msg){
+ bot.sendAudio(msg.chat.id,"",{caption : "Nucelar, la palabra es nucelar."});
+});
+bot.onText(palabrapython, function(msg){
+ bot.sendMessage(msg.chat.id, "Ha dicho Python 🤮");
+});
+bot.onText(palabrajava, function(msg){
+ bot.sendMessage(msg.chat.id, "Intenté ligar con una informática, pero no sé deJAVA (ba dum chss...)");
+});
+bot.onText(palabradebian, function(msg){
+ bot.sendMessage(msg.chat.id, "Hola caracola 🐚");
+});
+bot.onText(palabrawindows, function(msg){
+ bot.sendMessage(msg.chat.id, "¡Windows días! 🪟");
+});
+bot.onText(palabralloro, function(msg){
+ bot.sendMessage(msg.chat.id, msg.chat.first_name + " deja de llorar.");
+});
+*/
diff --git a/DiskoBOTlo_Telegram/package.json b/DiskoBOTlo_Telegram/package.json
new file mode 100644
index 0000000..057e869
--- /dev/null
+++ b/DiskoBOTlo_Telegram/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "DiskoboBOTlo",
+ "version": "3.0.0",
+ "description": "Bot de la asociación Diskobolo de la Facultad de Informática de la Universidad Complutense de Madrid.",
+ "main": "bot.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "keywords": [],
+ "author": "Fernando Méndez Torrubiano (https://fermdez.ddns.net | @HumperCobra)",
+ "license": "Educational Community License v2.0 (ECL-2.0)",
+ "dependencies": {
+ "node-telegram-bot-api": "^0.51.0",
+ "weather-js": "^2.0.0"
+ }
+}
diff --git a/FDIeSports_Discord_bot/bot.js b/FDIeSports_Discord_bot/bot.js
new file mode 100644
index 0000000..a4d5cbb
--- /dev/null
+++ b/FDIeSports_Discord_bot/bot.js
@@ -0,0 +1,83 @@
+// Librerías y dependendias:
+const Discord = require("discord.js");
+const client = new Discord.Client();
+const config = require("./config.json");
+
+// Prefijo para comandos "/":
+let prefix = config.prefix;
+
+
+
+// Funciones del bot:
+client.on('ready', () => {
+ // Mensaje al iniciar el bot:
+ console.log("[ " + Date() + " ] Se ha iniciado el bot.");
+
+});
+
+client.on('message', message => {
+ // Ignoramos el contenido de los mensajes del BOT (evita bucle infinito):
+ /* if (!message.content.startsWith('LOL') || !message.content.startsWith('CSGO')
+ || !message.content.startsWith('VALORANT') || !message.content.startsWith('OVERWATCH')
+ || !message.content.startsWith('TITANFALL') || !message.content.startsWith('FORNITE')
+ || !message.content.startsWith('QUAKE')) return; */
+ // if (message.author.bot) return;
+
+ // Id del canal de bienvenida:
+ var welcomeChanel = client.channels.cache.get(config.welcomeChanel);
+ // Id del canal de administración:
+ var adminChanel = client.channels.cache.get(config.adminChanel);
+ // Rol que se va a asignar:
+ var rol = message.guild.roles.cache.get(config.lolID);
+
+ // Asignación del rol:
+ if(message.channel == welcomeChanel){
+ switch(message.content){
+ case 'LOL': rol = message.guild.roles.cache.get(config.lolID);
+ break;
+ case 'CSGO': rol = message.guild.roles.cache.get(config.csgoID);
+ break;
+ case 'VALORANT': rol = message.guild.roles.cache.get(config.valorantID);
+ break;
+ case 'OVERWATCH': rol = message.guild.roles.cache.get(config.overwatchID);
+ break;
+ case 'TITANFALL': rol = message.guild.roles.cache.get(config.titanfallID);
+ break;
+ case 'FORNITE': rol = message.guild.roles.cache.get(config.forniteID);
+ break;
+ case 'QUAKE': rol = message.guild.roles.cache.get(config.quakeID);
+ break;
+ }
+ if(message.content === 'LOL' || message.content === 'CSGO'
+ || message.content === 'VALORANT' || message.content === 'OVERWATCH'
+ || message.content === 'TITANFALL' || message.content === 'FORNITE' || message.content === 'QUAKE') {
+ if(message.member.roles.cache.has(rol)) {
+ message.channel.send('Ya tienes el rol asignado ');
+ console.log("[ " + Date() + " ] Se ha interactuado con" + message.member.user.username + " en #BIENVENIDA.");
+ }
+ else {
+ message.member.roles.add(rol).catch(console.error); //Agregamos el rol al usuario
+ message.channel.send(message.member.user.username + ' *¡Bienvenido al servidor de FDIeSports! 👋🏻* \n' +
+ '⚠️ Usa los canales adecuados para hablar de cada tema y respeta a los demás. ⚠️ \n' +
+ '👉 Se te ha asignado el rol: `'+rol.name+'` 👈\n\n' +
+ '🐦 Puedes seguirnos en *twitter* : https://twitter.com/FDIeSports 🐦\n\n' +
+ '🌍 Recuerda que si tienes cualquier duda, puedes consultar la web : *https://esports.fdi.ucm.es* 🌍\n', { parse_mode: 'Markdown' });
+ console.log("[ " + Date() + " ] Se ha asignado un rol de rol a " + message.member.user.username );
+ }
+ }
+ else if(!(message.member.roles.cache.has(rol.id))) {
+ message.channel.send(message.member.user.username + ' escribe el nombre del equipo al que perteneces (en mayúsculas), para que se te asigne el rol.\n\n' +
+ '*Roles disponibles*: LOL | CSGO | VALORANT | OVERWATCH | TITANFALL | FORNITE | QUAKE.', {parse_mode: 'Markdown'});
+ console.log("[ " + Date() + " ] Se ha solicitado a " + message.member.user.username + " que diga a qué equipo pertenece.");
+ }
+
+ }
+
+ if(message.channel == adminChanel) {
+ if(message.content.startsWith(prefix + 'ping')) {
+ message.channel.send(`Pong 🏓`);
+ }
+ }
+});
+
+client.login(config.BOT_TOKEN);
\ No newline at end of file
diff --git a/FDIeSports_Discord_bot/package.json b/FDIeSports_Discord_bot/package.json
new file mode 100644
index 0000000..8948279
--- /dev/null
+++ b/FDIeSports_Discord_bot/package.json
@@ -0,0 +1,15 @@
+{
+ "name": "FDIeSports_Discord_bot",
+ "version": "1.0.0",
+ "description": "Bot de la agrupación de esports de la Facultad de Informática de la Universidad Complutense de Madrid.",
+ "main": "bot.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "keywords": [],
+ "author": "Fernando Méndez (https://fermdez.ddns.net | @HumperCobra)",
+ "license": "Educational Community License v2.0 (ECL-2.0)",
+ "dependencies": {
+ "discord.js": "^12.5.1"
+ }
+}
diff --git a/FDIeSports_Telegram_bot/README.md b/FDIeSports_Telegram_bot/README.md
new file mode 100644
index 0000000..7902a60
--- /dev/null
+++ b/FDIeSports_Telegram_bot/README.md
@@ -0,0 +1,109 @@
+# FDIeSports_bot 🤖
+
+## Índice
+1. [Descripción](#1-descripción-)
+2. [Autor](#2-autor-%EF%B8%8F)
+3. [Advertencia](#3-advertencia-%EF%B8%8F)
+4. [Generar un token con @BotFather](#4-generar-un-token-con-botfather)
+5. [Ejecución](#5-ejecución-%EF%B8%8F)
+* 5.1. [Instalación _node_modules_](#instalación-node_modules-)
+* 5.2. [Poner el Bot en producción](#poner-el-bot-en-producción-%EF%B8%8F)
+ * 5.2.1. [En Windows](#en-windows-)
+ * 5.2.2. [En Linux](#en-linux-debianubuntu-)
+* 5.3 [Añadir nuevas librerías](#53-añadir-nuevas-librerías-)
+6. [Licencia](#6-licencia-)
+7. [Enlace al Bot](#7-enlace-al-bot-)
+***
+## 1. Descripción 📖
+Bot de Telegram para la agrupación de esports de la Facultad de Informática de la Universidad Complutense de Madrid.
+***
+## 2. Autor ✒️
+Fernando Méndez (https:/fermdez.ddns.net | @HumperCobra)
+***
+## 3. Advertencia ⚠️
+Desbes generar tu propio token para el bot y añadirlo a _const token = 'AQUÍ_A_TU_TOKEN';_ en el archivo *bot.js*.
+***
+## 4. Generar un token con @BotFather
+1. Inicia un chat con https://t.me/botfather
+2. Escribe en el chat el comando */newbot*
+3. Te pedirá el alias y luego el nombre del bot (debe contener la palabra _bot_).
+4. Nos devolverá el token de nuestro bot, por ejemplo:
+
+ > Use this token to access the HTTP API: 668219748:ABCRTZu7zNT5QO2bRfZfbPIXBLXb2U-ojVX
+***
+## 5. Ejecución 🛠️
+### 5.1 Instalación _node_modules_ 🔧
+1. Creamos un directorio para el bot y guardamos ahí el archivo *bot.js*.
+2. Instalar *node.js*
+ * En Windows/Mac: https://nodejs.org/es/download/.
+ * Si tienes Linux (Debian/Ubuntu), usa los siguientes comandos:
+ ```
+ $ sudo apt-get update
+ $ sudo apt-get upgrade
+ $ sudo apt-get install curl
+
+ $ cd ~
+ $ curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
+
+ $ sudo apt-get install -y nodejs
+
+ $ cd ./ruta_del_directorio_del_bot/
+ $ npm install
+ ```
+3. Comprobar que se ha instalado con el comando:
+ ```
+ >/$ node --version
+ ```
+4. Dentro del directorio del bot, ejecutar los siguientes comandos:
+ ```
+ >/$ npm init --yes
+ >/$ npm install --save node-telegram-bot-api
+ ```
+5. Comprobar que se ha generado el directorio _node_modules_.
+### 5.2 Poner el Bot en producción ⚙️
+#### 5.2.1 En Windows 💻
+* Instala *nodejs*, si no lo hiciste en el punto anterior: https://nodejs.org/es/download/
+* Ejecutar en CMD o PS los comandos:
+ ```
+ > cd ./ruta_del_directorio_del_bot/
+ > node bot.js
+ ```
+* El proceso se puede automatizar creando un archivo .bat y añadiéndolo al programador de tareas.
+
+#### 5.2.2 En Linux (Debian/Ubuntu) 🐧
+* Instalamos *nodejs*, si no lo hicimos en el punto anterior:
+ ```
+ $ sudo apt-get update
+ $ sudo apt-get upgrade
+ $ sudo apt-get install curl
+
+ $ cd ~
+ $ curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
+
+ $ sudo apt-get install -y nodejs
+
+ $ cd ./ruta_del_directorio_del_bot/
+ $ npm install
+```
+
+* Ejecutamos el bot con el comando:
+ ```
+ $ node bot.js
+ ```
+
+* El proceso se puede automatizar creando un script.
+
+### 5.3 Añadir nuevas librerías 📚
+* Primero abrir un terminal/PowerShell/CMD (dependiendo de nuestro SO) e ir al directorio de nuestro bot:
+ ```
+ cd ./ruta_del_directorio_del_bot/
+ ```
+* Si por ejemplo queremos añadir la librería _weather-js_, deberemos escribir el siguiente comando:
+ ```
+ npm install weather-js
+ ```
+***
+## 6. Licencia 📄
+Educational Community License v2.0 (ECL-2.0).
+## 7. Enlace al Bot 🤖
+> https://t.me/FDIeSports_bot
diff --git a/FDIeSports_Telegram_bot/bot.js b/FDIeSports_Telegram_bot/bot.js
new file mode 100644
index 0000000..7ad58d8
--- /dev/null
+++ b/FDIeSports_Telegram_bot/bot.js
@@ -0,0 +1,178 @@
+/*
+{
+ "name": "FDIeSports_bot",
+ "version": "1.0.0",
+ "description": "Bot oficial de la agrupación de esports de la Facultad de Informática de la Universidad Complutense de Madrid.",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "keywords": [],
+ "author": "Fernando Méndez Torrubiano",
+ "license": "Educational Community License v2.0 (ECL-2.0)",
+ "dependencies": {
+ "node-telegram-bot-api": "^0.51.0"
+ }
+}
+*/
+// Importar las librerías:
+const TelegramBot = require('node-telegram-bot-api');
+// Token del bot:
+const token = '1650731934:AAHYXV0t1hwE0j2TbcVFMXWQEfFulyj4BfU';
+// Create the bot:
+const bot = new TelegramBot(token, {polling:true});
+
+// Palabras reservadas:
+//const _despacho = new RegExp(/\b([Dd]espacho)\b/);
+
+
+// Captura de errores:
+bot.on('polling_error', function(error){
+ console.log(error);
+});
+
+// Inicio del bot:
+bot.onText(/^\/start/, function(msg){
+ var chatId = msg.chat.id;
+ var nameUser = msg.from.first_name;
+
+ bot.sendMessage(chatId, "*Bienvenido al bot de asistencia de FDIeSports*, " + "*"+nameUser+"*" + ".", {parse_mode : "Markdown"});
+ bot.sendPhoto(chatId, "https://esports.fdi.ucm.es/images/LOGO.png",
+ {caption: "Nacida como una agrupación de equipos de eSports para la Facultad de Informática y formada por alumnos de toda la Universidad Complutense de Madrid.\n" +
+ "FDIeSports está respaldada por la histórica Asociación Diskóbolo."});
+
+ menu(msg);
+});
+
+// Llama al menú interactivo de ayuda:
+bot.onText(/^\/help/, (msg) => {
+ menu(msg);
+});
+
+// Menú interactivo de ayuda:
+function menu(msg){
+ var chatId = msg.chat.id;
+
+ bot.sendMessage(chatId, "Selecciona una opción (escribe /help para volver a mostrar este menú): ",
+ {
+ reply_markup: {
+ inline_keyboard: [
+ [
+ {
+ text:"Grupos de Whatsapp de los equipos📱", callback_data: 'grupos'
+ }
+ ],
+ [
+ {
+ //text:"Inscripción", callback_data: 'registro'
+ text:"Inscripción👤", url: "https://esports.fdi.ucm.es/registro"
+ },
+ {
+ text:"Despacho📍", callback_data: 'despacho'
+ }
+ ],
+ [
+ {
+ text:"Redes Sociales💙", callback_data: 'redes'
+ }
+ ],
+ [
+ {
+ text:"Contacto📞", url: "https://esports.fdi.ucm.es/#four"
+ }
+ ],
+ ]
+ },
+ parse_mode:"HTML",
+ });
+}
+
+// Respuestas a la pulsación de botones:
+bot.on('callback_query', function onCallbackQuery(accionboton){
+ const data = accionboton.data;
+ const msg = accionboton.message;
+ var chatId = msg.chat.id;
+
+ if(data == 'grupos'){
+ whatsapp(msg);
+ }
+
+ if(data == 'registro'){
+ registrar(msg);
+ }
+
+ if(data == 'despacho'){
+ bot.sendMessage(chatId, "Aquí tienes la localización del despacho de *Diskobolo/FDIeSports*:", {parse_mode: "Markdown"});
+ bot.sendLocation(chatId, 40.45365669535852, -3.73307118835828177);
+ }
+
+ if(data == 'redes'){
+ redes(msg);
+ }
+
+});
+
+// Registro de usuario en la base de datos (EN DESARROLLO):
+function registrar(msg){
+ var opts = {
+ reply_markup: JSON.stringify({
+ keyboard: [
+ [{text: 'Enviar datos', request_contact: true}],
+ [{text: 'Cancelar', request_contact: false}],
+ ],
+ resize_keyboard: true,
+ one_time_keyboard: true,
+ }),
+ };
+ bot.sendMessage(msg.chat.id, 'Formulario de registro: ', opts);
+ bot.on('contact', (msg) => {
+ console.log("Nombre: " + msg.contact.first_name /*+ "\nApodo: " + msg.contact.username*/ + "\nUserID:" + msg.contact.user_id + "\nNúmero Telf: " + msg.contact.phone_number);
+ bot.sendMessage(msg.chat.id, "*"+msg.contact.first_name+"*" + ", *te has registrado en FDIeSports, correctamente*.", {parse_mode: "Markdown"});
+ whatsapp(msg);
+ });
+}
+
+// Muestra los grupos de Whastapp de los equipos:
+function whatsapp(msg){
+ bot.sendMessage(msg.chat.id, "Seleccione el equipo al que quiere unirse: ", {
+ reply_markup: {
+ inline_keyboard: [
+ [
+ {text: "Equipo de LOL", url: "https://chat.whatsapp.com/5enTKgyYdefKNBpBq10igX"}
+ ],
+ [
+ {text: "Equipo de CSGO", url: "https://chat.whatsapp.com/CZJZshnndo6AUSveLMh2e1X"},
+ {text: "Equipo de OverWatch", url: "https://chat.whatsapp.com/3dN1UvXj6WO3oeqIMTWHW2"}
+ ],
+ [
+ {text: "Equipo de Valorant", url: "https://chat.whatsapp.com/E2J2WgW676TKZB8el8ODyo"}
+ ]
+ ]
+ }
+ });
+}
+
+// Muestra las redes sociales de FDIeSports:
+function redes(msg){
+ bot.sendMessage(msg.chat.id, "*Síguenos* en nuestras principales redes sociales: ", {
+ reply_markup: {
+ inline_keyboard: [
+ [
+ {text: "Discord🎧", url: "https://discordapp.com/invite/zjAdrfz"}
+ ],
+ [
+ {text: "Twitter🐦", url: "https://twitter.com/FDIeSports"},
+ {text: "Web🌐", url: "https://esports.fdi.ucm.es/"}
+ ],
+ ]
+ },
+ parse_mode: "Markdown",
+ });
+}
+
+bot.onText(/^\/author/, function(msg){
+ var chatId = msg.chat.id;
+
+ bot.sendMessage(chatId, "Autor👤: *Fernando Méndez 'Humpercobra'* \n" +
+ "Web🌐: https://fermdez.ddns.net", {parse_mode : "Markdown"})
+});
\ No newline at end of file
diff --git a/FDIeSports_Telegram_bot/package.json b/FDIeSports_Telegram_bot/package.json
new file mode 100644
index 0000000..ed12c44
--- /dev/null
+++ b/FDIeSports_Telegram_bot/package.json
@@ -0,0 +1,15 @@
+{
+ "name": "FDIeSports_bot",
+ "version": "1.0.0",
+ "description": "Bot oficial de la agrupación de esports de la Facultad de Informática de la Universidad Complutense de Madrid.",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "keywords": [],
+ "author": "Fernando Méndez Torrubiano",
+ "license": "Educational Community License v2.0 (ECL-2.0)",
+ "dependencies": {
+ "node-telegram-bot-api": "^0.51.0"
+ }
+}
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..cb63109
--- /dev/null
+++ b/README.md
@@ -0,0 +1,11 @@
+# JS 💻
+Javascript projets.
+
+Para uso exclusivo con fines de estudio. Se prohíbe su uso para entregas calificables y/o uso comercial.
+***
+## Directorios 🗂
+1. [DiskoBOTlo](https://github.com/FerMdez/Javascript/tree/main/DiskoBOTlo)
+2. [FDIeSports_bot](https://github.com/FerMdez/Javascript/tree/main/FDIeSports_bot)
+***
+## Licencia 📄
+Educational Community License v2.0 (ECL-2.0).