Discord
Discord es una plataforma de comunicación versátil diseñada inicialmente para jugadores, pero que desde entonces ha ampliado su atractivo a una gama más amplia de comunidades y grupos en línea. Ofrece un rico conjunto de funciones destinadas a fomentar la interacción y construir comunidades a través de la comunicación por texto, voz y video.
Características clave de Discord:- Servidores y Canales:
-
Servidores: Los servidores de Discord son como centros comunitarios individuales donde grupos de personas pueden reunirse para comunicarse y compartir contenido. Cada servidor puede subdividirse en múltiples canales.
-
Canales: Estas son áreas específicas dentro de un servidor designadas para temas particulares o tipos de interacción. Los canales pueden ser de texto o de voz, y los administradores del servidor pueden crear múltiples canales para organizar las discusiones de manera efectiva.
-
Comunicación por Voz y Video:
-
Los usuarios pueden unirse a canales de voz donde pueden hablar con otros usando su micrófono, compartir su pantalla o incluso chatear por video. Esta función es particularmente popular entre los jugadores para coordinar actividades en el juego, pero también se utiliza para reuniones virtuales, clases en vivo y chats de voz casuales.
-
Mensajería de texto:
-
Los canales de texto permiten a los usuarios comunicarse a través de mensajes escritos. Estos canales admiten formato de texto enriquecido, mensajes directos, menciones y medios incrustados (imágenes, videos y enlaces).
-
Integración y Bots:
-
Discord admite la integración con otros servicios como Spotify, Twitch y muchos servicios de juegos, mejorando la experiencia del usuario al permitir actividades como la transmisión de música, el intercambio de estadísticas de juegos o la transmisión de partidas en vivo.
-
Los bots son otra característica potente de Discord, que pueden automatizar tareas, gestionar actividades del servidor o incluso añadir elementos interactivos divertidos para los usuarios.
-
Roles y Permisos:
-
Discord permite una amplia personalización de los roles y permisos de los usuarios dentro de un servidor. Los administradores pueden asignar roles con permisos específicos que controlan quién puede acceder a ciertos canales, modificar la configuración del servidor o gestionar a otros usuarios.
-
Seguridad y Privacidad:
-
Discord ofrece robustos controles de privacidad y características de seguridad, incluyendo autenticación de dos factores, herramientas de moderación y la capacidad de controlar quién puede enviar mensajes directos o añadirte como amigo.
-
Uso Multiplataforma:
-
Discord es accesible a través de aplicaciones de escritorio para Windows, macOS y Linux, aplicaciones móviles para Android e iOS, y también se puede ejecutar directamente en navegadores web, lo que lo hace ampliamente accesible.
OpenAI
OpenAI es una organización de investigación de inteligencia artificial que tiene como objetivo promover y desarrollar una IA amigable de tal manera que beneficie a la humanidad en su conjunto. Fundada en diciembre de 2015 por Elon Musk, Sam Altman y otros, OpenAI inicialmente comenzó como una entidad sin fines de lucro, pero luego formó una rama con fines de lucro limitados para atraer inversión externa.
Los aspectos clave de OpenAI incluyen:
-
Investigación y Desarrollo: OpenAI lleva a cabo investigación de vanguardia en IA y aprendizaje automático, con un enfoque en el desarrollo de tecnologías y capacidades avanzadas de IA.
-
Seguridad y Ética: Una parte fundamental de la misión de OpenAI es asegurar que las tecnologías de IA se desarrollen de manera segura y ética, gestionando los riesgos potenciales de forma responsable.
-
Modelos GPT: OpenAI es bien conocida por sus modelos Generative Pre-trained Transformer (GPT), que son capaces de realizar una amplia gama de tareas de procesamiento de lenguaje natural.
-
Colaboración y Licencias: OpenAI colabora con varias organizaciones y empresas y ofrece versiones comerciales de sus modelos de IA, como GPT-3, a través de servicios API.
Replit
Replit (anteriormente Repl.it) es un entorno de desarrollo integrado (IDE) en línea que permite a los usuarios escribir, ejecutar y compartir código en línea. Es una herramienta poderosa para desarrolladores, educadores y estudiantes por igual, diseñada para hacer la codificación más accesible y colaborativa. Replit soporta una amplia gama de lenguajes de programación, incluyendo Python, JavaScript, Ruby, C++ y muchos otros.
Características Clave de Replit:- Configuración Instantánea del IDE:
-
Cero Instalación: Replit se ejecuta completamente en el navegador, eliminando la necesidad de instalar software o gestionar dependencias en tu máquina local.
-
Soporte para Muchos Lenguajes: Replit soporta más de 50 lenguajes de programación, permitiéndote cambiar entre proyectos y lenguajes sin ninguna configuración adicional.
-
Codificación Colaborativa:
-
Colaboración en Tiempo Real: Similar a Google Docs, Replit permite a múltiples usuarios codificar simultáneamente en el mismo entorno. Esta característica es particularmente útil para la programación en pareja, la enseñanza o la resolución colaborativa de problemas.
-
Modo Multijugador: Este modo permite la colaboración en tiempo real con otros usuarios, incluyendo una función de chat para discutir el código directamente dentro del IDE.
-
Alojamiento y Despliegue:
-
Despliegue Instantáneo: Replit proporciona servicios de alojamiento, lo que significa que puedes desarrollar y desplegar aplicaciones web directamente desde la plataforma. Genera una URL pública y en vivo para cada proyecto.
-
Repls siempre activos: Para usuarios de pago, Replit ofrece la capacidad de mantener las aplicaciones siempre en funcionamiento, incluso cuando cierras el navegador, lo cual es ideal para bots, aplicaciones web y otros servicios continuos.
-
Control de versiones:
-
Soporte Git integrado: Replit integra Git, permitiendo a los usuarios enviar y extraer desde cualquier repositorio Git externo. Esta integración facilita el control de versiones y el intercambio de código a través de plataformas como GitHub.
-
Herramientas educativas:
-
Gestión de aulas: Los educadores pueden gestionar tareas de codificación, proporcionar comentarios y supervisar el progreso de los estudiantes directamente dentro de Replit. Es ampliamente utilizado en entornos educativos debido a su facilidad de uso y configuración mínima.
-
Plantillas y ejemplos: Replit ofrece una variedad de plantillas y proyectos de ejemplo que pueden ayudar a los usuarios a empezar rápidamente con nuevos lenguajes o frameworks.
-
Entorno Nix:
-
Entornos Personalizables: Los usuarios avanzados pueden personalizar su entorno de codificación usando Nix, una potente herramienta de gestión de paquetes. Esta característica permite a los desarrolladores definir entornos de proyecto precisos que incluyen dependencias de sistema específicas.
-
Soporte de Base de Datos Integrado:
-
Base de Datos Integrada: Replit incluye una función de base de datos integrada para un almacenamiento simple de clave-valor, lo cual es útil para aplicaciones que necesitan persistir datos sin configurar una base de datos externa.
Mejores Usos de Replit:- Prototipado Rápido: Prototipa aplicaciones rápidamente sin preocuparte por la configuración del entorno.
-
Aprendizaje y Educación: Ideal para aulas y autoaprendizaje, gracias a su accesibilidad y facilidad de uso.
-
Entrevistas Técnicas: Realiza entrevistas de codificación y evaluaciones fácilmente con sesiones compartidas.
-
Hackathons *: Inicia proyectos rápidamente durante los hackatones sin perder tiempo en la configuración.
Demostración
Nota al margen:
Async y await
En Python,asyncyawaitson palabras clave utilizadas para definir y manejar código asíncrono, que es código que te permite realizar operaciones de larga duración sin bloquear la ejecución de tu programa. Esto es particularmente útil para tareas ligadas a E/S y a la red, como realizar solicitudes de red, leer o escribir en archivos, etc., donde el programa pasa la mayor parte de su tiempo esperando eventos externos.
Aquí tienes una explicación detallada de ambas palabras clave y cómo funcionan en Python:
-
La palabra clave
async -
Definición de funciones asíncronas: La palabra clave
asyncse utiliza para declarar una función como una "función asíncrona". Esto significa que la función no es bloqueante y devuelve un objetoawaitable, específicamente un objetoasyncio.Future. Una función asíncrona se define utilizando la sintaxisasync def:
async def fetch_data():
# function body
Al declarar una función conasync def, le estás diciendo a Python que esta función puede realizar operaciones asíncronas y puede ser pausada y reanudada.
-
La palabra clave
await -
Pausar y reanudar la ejecución: La palabra clave
awaitse utiliza dentro de una función asíncrona para pausar la ejecución de la función hasta que el objetoawaitable(como los devueltos por otras funciones asíncronas) se resuelva. Esto permite que la función espere a que un resultado esté disponible mientras permite que otras tareas se ejecuten en el ínterin.
async def fetch_data():
data = await some_async_function()
return data
En este ejemplo,some_async_function()es otra función asíncrona, yawaitpausafetch_data()hasta quesome_async_function()finaliza su tarea y devuelve algunos datos.
-
Cómo
asyncyawaitTrabajan Juntos -
Concurrencia: Juntos,
asyncyawaitproporcionan una forma de escribir código concurrente en Python. Al usar estas palabras clave, puedes mantener tu aplicación receptiva permitiendo que Python maneje otras tareas mientras espera que se completen las operaciones de E/S. Esto no es ejecución paralela sino ejecución concurrente (a través de multitarea cooperativa). -
Bucle de eventos: El concepto central detrás de
asyncyawaites el bucle de eventos, que es proporcionado por la bibliotecaasyncioen Python. El bucle de eventos gestiona y distribuye la ejecución de diferentes tareas. Realiza un seguimiento de todas las tareas en ejecución y reanuda las funciones pausadas porawaittan pronto como sus operaciones esperadas se completan.
Ejemplo de uso
Aquí hay un ejemplo simple usandoasynciopara realizar una tarea de forma asíncrona:
import asyncio
async def main():
print("Hello")
await asyncio.sleep(1) # Asynchronous sleep, doesn't block the event loop
print("world")
# Running the asynchronous main function
asyncio.run(main())
Aplicaciones prácticas
-
Desarrollo web: En servidores web y aplicaciones web,
asyncyawaitpermiten manejar múltiples solicitudes web de forma concurrente. Esto hace que el manejo de alta carga y la realización de múltiples solicitudes de red sean eficientes. -
Recopilación de Datos: Son útiles en escenarios donde se necesita recopilar datos de múltiples fuentes a través de internet, como APIs o bases de datos, sin esperar a que cada tarea se complete secuencialmente.
Paso0 ¡Hola Bot!
- Paso 1: Instalar discord.py
Primero, necesitas instalar la librería discord.py. Puedes usar Rye como gestor de paquetes
- Paso 2: Configura Tu Bot de Discord
Ve al Portal de Desarrolladores de Discord (https://discord.com/developers/applications). Crea una nueva aplicación y dale un nombre. Ve a la pestaña Bot y haz clic en "Add Bot". Copia el token que se genera. Necesitarás este token para ejecutar tu bot.
- Paso 3: Escribe el Script de Python
Crea un script de Python que use el token del bot para iniciar sesión y responder a los mensajes. A continuación, se muestra un ejemplo básico de un bot que responde a comandos sencillos:
Variables de entorno
import discord
import os
from dotenv import load_dotenv
# Load environment variables from .env file
load_dotenv()
intents = discord.Intents.default()
intents.messages = True
client = discord.Client(intents=intents)
@client.event
async def on_ready():
print(f'Logged in as {client.user}')
@c*lient.event
async def on_message(message):
# do not let the bot respond to itself
if message.author == client.user:
return
elif message.content.startswith('!hello'):
await message.channel.send('Hello!')
elif message.content.startswith('hi'):
await message.channel.send('welcome!')
elif message.content.startswith('what is the best meetup up there?'):
await message.channel.send('The Ubuntu Tech Hive :)')
elif message.content.startswith('!bye'):
await message.channel.send('Goodbye!')
else:
await message.channel.send("¡¡No entendí tu solicitud!!")
client.run(os.environ ["DISCORD_TOKEN"])import math # importing the math library
Qué se utilizó:
-
dotenv api
-
Disord token
-
Discord api bot
-
Python3
Limitaciones
-
El bot no puede interactuar.
-
Solo responde a indicaciones específicas basadas en condiciones
-
No es muy útil
Paso 1 Hagamos el bot más útil
Herramientas necesarias: OpenAi api dotenv api Disord token Python3
import discord
import my_openai
import os
from dotenv import load_dotenv
# Load environment variables from .env file
load_dotenv()
intents = discord.Intents.default()
intents.messages = True
client = discord.Client(intents=intents)
@client.event
async def on_ready():
print(f'Logged in as {client.user}')
@client.event
async def on_message(message):
# no permitir que el bot se responda a sí mismo
if message.author == client.user:
return
if message.content.startswith('$hello'):
await message.channel.send('Hola, ¿en qué puedo ayudarte?')
# Comprobar si el mensaje comienza con una palabra clave de pregunta
if message.content.startswith('!ask'):
# Eliminar la parte del comando y quitar los espacios en blanco iniciales/finales
user_question = message.content [len('!ask'):].strip()
if user_question:
try:
response = my_openai.generate_answer(message.content)
await message.channel.send("¡Espera un momento! Buscando la respuesta...")
await message.channel.send(response)
except Exception as e:
await message.channel.send(f"Error al procesar tu solicitud: {str(e)}")
else:
await message.channel.send("Por favor, proporciona una pregunta después de !ask")
if message.content.startswith('$question'):
response = my_openai.generate_answer(message.content)
await message.channel.send("buscando respuesta")
await message.channel.send(response)
# Reemplaza 'your_token_here' con el token real de tu bot
client.run(os.environ ["DISCORD_TOKEN"])
from openai import OpenAI
import os
# Configura tus credenciales de la API de OpenAI
client = OpenAI(
# Esto es lo predeterminado y puede omitirse
api_key=os.environ ["OPENAI_TOKEN"],
)
MODEL = "gpt-3.5-turbo"
Define the function to generate answers
def generate_answer(question):
response = client.chat.completions.create(
model=MODEL,
messages= [
{"role": "system", "content": "You are a helpful assistant in a discord server answering question and being helpful."},
{"role": "user", "content": question},
],
temperature=0,
)
return response.choices [0].message.content
## Limitaciones
- El bot aún es local
- No es útil para nuestro ubuntu ni para nadie más
- No hay estado para guardar
**Lo que se utilizó:**
- dotenv api
- Token de Disord
- Bot de la API de Discord
- Python3
- Clave de la API de OpenAI
## Paso 2: ¡Vamos a desplegar, presentando Replit!
import discord
import my_openai
import os
from dotenv import load_dotenv
Load environment variables from .env file
load_dotenv()
intents = discord.Intents.default()
intents.messages = True
client = discord.Client(intents=intents)
@client.event
async def on_ready():
print(f'Iniciado sesión como {client.user}')
@client.event
async def on_message(message):
# no permitir que el bot se responda a sí mismo
if message.author == client.user:
return
if message.content.startswith('$hello'):
await message.channel.send('¿Hola, cómo puedo ayudarte?')
# Comprobar si el mensaje comienza con una palabra clave de pregunta
if message.content.startswith('!ask'):
# Eliminar la parte del comando y quitar los espacios en blanco iniciales/finales
user_question = message.content [len('!ask'):].strip()
if user_question:
try:
response = my_openai.generate_answer(message.content)
await message.channel.send("¡Espera un momento! Buscando la respuesta...")
await message.channel.send(response)
except Exception as e:
await message.channel.send(f"Error al procesar su solicitud: {str(e)}")
else:
await message.channel.send("Por favor, proporcione una pregunta después de !ask")
if message.content.startswith('$question'):
response = my_openai.generate_answer(message.content)
await message.channel.send("buscando respuesta")
await message.channel.send(response)
# Reemplace 'your_token_here' con el token real de su bot
client.run(os.environ ["DISCORD_TOKEN"])
from replit import db
# URLs y sus claves personalizadas correspondientes
urls = {
"deep-dive-into-rag-with-langchain": "https://dev.ubuntuhive.tech/en-us/articles/deep-dive-into-rag-with-langchain/",
"exploring-new-chatgpt-features": "https://dev.ubuntuhive.tech/en-us/articles/exploring-new-chatgpt-features-/",
"build-small-apps-with-llms": "https://dev.ubuntuhive.tech/en-us/articles/build-small-apps-with-llms/",
"docker-orchestra-swarm-k8s-kubernetes-for-beginners": "https://dev.ubuntuhive.tech/en-us/articles/docker-orchestra-swarm-k8s-kubernetes-for-beginners/",
"devops-from-scratch-automated-basics": "https://dev.ubuntuhive.tech/en-us/articles/devops-from-scratch-automated-basics/",
"from-networks-to-http-and-apis": "https://dev.ubuntuhive.tech/en-us/articles/from-networks-to-http-and-apis/",
"data-and-cloud-infrastructure-as-code": "https://dev.ubuntuhive.tech/en-us/articles/data-and-cloud-infrastructure-as-code/"
}
# Almacenar en la base de datos bajo la clave 'articles'
db ["articles"] = urls
from openai import OpenAI
import os
# Configura tus credenciales de la API de OpenAI
# my_api_key = ''
client = OpenAI(
# Esto es lo predeterminado y se puede omitir
api_key=os.environ ["OPENAI_TOKEN"],
)
MODEL = "gpt-3.5-turbo"
# Define la función para generar respuestas
def generate_answer(question):
# ejemplo con un mensaje del sistema
response = client.chat.completions.create(
model=MODEL,
messages= [
{"role": "system", "content": "Eres un asistente útil en un servidor de Discord que responde preguntas y es de ayuda."},
{"role": "user", "content": question},
],
temperature=0,
)
return response.choices [0].message.content
Qué se utilizó:
-
dotenv api
-
Disord token
-
Discord api bot
-
Python3
-
openai api key
-
replit
Paso 3: Dar la bienvenida a los nuevos miembros
import discord
import my_openai as opai
import os
from discord.ext import commands
from replit import db
from dotenv import load_dotenv
# Load environment variables from .env file
load_dotenv()
intents = discord.Intents.default()
intents.message_content = True
# Initialize the Discord bot
bot = commands.Bot(command_prefix='!',intents=intents)
@bot.event
async def on_ready():
print(f'Logged in as {bot.user}!')
@bot.command(help="Pregunta al usuario qué tipo de resumen está buscando.")
async def choose_article(ctx):
# Retrieve the articles from the Replit database
articles = db ["articles"]
# Create a message with options
options = "\n".join([f"Send {idx+1} for {key.replace('-', ' ').title()}" for idx, key in enumerate(articles.keys())])
prompt = "Por favor, elige de la siguiente lista:\n" + options
await ctx.send(prompt)
# Función de verificación para validar la elección del usuario
def check(m):
return m.author == ctx.author and m.content.isdigit() and 1 <= int(m.content) <= len(articles)
try:
# Esperar la respuesta del usuario
msg = await bot.wait_for('message', check=check, timeout=60.0) # 60 segundos para responder
choice = int(msg.content) - 1
selected_key = list(articles.keys()) [choice]
selected_article = articles [selected_key]
# Puedes añadir funcionalidad adicional aquí para resumir el artículo
await ctx.send(f"Has seleccionado: {selected_key.replace('-', ' ').title()}\nURL: {selected_article}")
await ctx.send("Por favor, espera mientras obtengo el resumen...")
await ctx.send(opai.generate_summary(selected_article))
except Exception as e:
await ctx.send('No se recibió una entrada válida o se agotó el tiempo de espera. Por favor, inténtalo de nuevo.')
@bot.command(help="Envía un mensaje de bienvenida con recursos útiles.")
async def new_member(ctx):
articles = db ["articles"]
most_recent_article_key = list(articles.keys()) [-1] # Obteniendo la clave del artículo más reciente
most_recent_article_url = articles [most_recent_article_key] # Obteniendo la URL
# Mensaje de bienvenida y recursos
welcome_message = (
f"¡Bienvenido al servidor, {ctx.author.mention}! 🎉 Aquí tienes algunos recursos que podrían serte útiles:\n"
f"1. Consulta nuestro último artículo: {most_recent_article_url}\n"
f"2. Visita nuestro sitio web de Ubuntu Hive para más información: https://dev.ubuntuhive.tech/en-us/\n"
f"3. Aprende más sobre tecnología con este tutorial completo: [Insert Your Tutorial Link Here]\n"
f"4. Otros recursos e información variada: [Insert More Links or Info Here]\n"
)
await ctx.send(welcome_message)
# Ejecutar el bot
token = os.getenv("DISCORD_TOKEN")
if token:
bot.run(token)
else:
print("Error: Token de Discord no encontrado en las variables de entorno. Asegúrese de que DISCORD_TOKEN esté configurado.")
from replit import db
# URLs y sus claves personalizadas correspondientes
urls = {
"deep-dive-into-rag-with-langchain": "https://dev.ubuntuhive.tech/en-us/articles/deep-dive-into-rag-with-langchain/",
"exploring-new-chatgpt-features": "https://dev.ubuntuhive.tech/en-us/articles/exploring-new-chatgpt-features-/",
"build-small-apps-with-llms": "https://dev.ubuntuhive.tech/en-us/articles/build-small-apps-with-llms/",
"docker-orchestra-swarm-k8s-kubernetes-for-beginners": "https://dev.ubuntuhive.tech/en-us/articles/docker-orchestra-swarm-k8s-kubernetes-for-beginners/",
"devops-from-scratch-automated-basics": "https://dev.ubuntuhive.tech/en-us/articles/devops-from-scratch-automated-basics/",
"from-networks-to-http-and-apis": "https://dev.ubuntuhive.tech/en-us/articles/from-networks-to-http-and-apis/",
"data-and-cloud-infrastructure-as-code": "https://dev.ubuntuhive.tech/en-us/articles/data-and-cloud-infrastructure-as-code/"
}
# Almacenar en la base de datos bajo la clave 'articles'
db ["articles"] = urls
from openai import OpenAI
import os
# Configura tus credenciales de la API de OpenAI
# my_api_key = ''
client = OpenAI(
# Esto es lo predeterminado y se puede omitir
api_key=os.environ ["OPENAI_TOKEN"],
)
MODEL = "gpt-3.5-turbo"
# Define la función para generar respuestas
def generate_answer(question):
# ejemplo con un mensaje del sistema
response = client.chat.completions.create(
model=MODEL,
messages= [
{"role": "system", "content": "Eres un asistente útil en un servidor de Discord que responde preguntas y es servicial."},
{"role": "user", "content": question},
],
temperature=0,
)
return response.choices [0].message.content
def generate_summary(articles):
response = client.chat.completions.create(
model=MODEL,
messages= [
{"role": "system", "content": "You are a helpful assistant in a discord server. You are great as providing summaries of text when given an article link. when prompted, provide a max of 200 words summary of the provided link"},
{"role": "user", "content": articles},
],
temperature=0,
)
return response.choices [0].message.content
Enlaces Importantes
-
Discord: Portal para Desarrolladores
-
Discord: discord.py
-
OpenAi: openai
-
OpenAi: recetario de openai
-
Replit: Replit
