python-aternos icon indicating copy to clipboard operation
python-aternos copied to clipboard

i have this error : Task exception was never retrieved

Open Varo1234 opened this issue 2 years ago • 3 comments

ERROR:asyncio:Task exception was never retrieved future: <Task finished name='Task-17' coro=<AternosWss.receiver() done, defined at /home/container/.local/lib/python3.10/site-packages/python_aternos/atwss.py:276> exception=RuntimeError('cannot call recv while another coroutine is already waiting for the next message')> Traceback (most recent call last): File "/home/container/.local/lib/python3.10/site-packages/python_aternos/atwss.py", line 283, in receiver data = await self.socket.recv() File "/home/container/.local/lib/python3.10/site-packages/websockets/legacy/protocol.py", line 532, in recv raise RuntimeError( RuntimeError: cannot call recv while another coroutine is already waiting for the next message

Varo1234 avatar Feb 24 '23 07:02 Varo1234

Hello.
Could you send me the version codes of python-aternos and websockets modules? (pip list or pip show <module>)

DarkCat09 avatar Feb 24 '23 07:02 DarkCat09

Also, it'd be great if you could show your code.

DarkCat09 avatar Feb 24 '23 07:02 DarkCat09

i´ve using it for personal use on my discord channel, this is the code.

import json
import discord
from discord.ext import commands
from python_aternos import Client, atserver, atwss, Lists

# Configuración del bot
prefix = '$'  # Cambiar command_prefix si lo deseas
intents = discord.Intents(messages=True, guilds=True, message_content=True)
bot = commands.Bot(command_prefix=prefix, intents=intents)

# archivo de credenciales
with open('credentials.json') as file:
	data = json.load(file)

# Credenciales para Discord y Aternos
secret_key = data["credentials"]["discord_bot"]
user = data["credentials"]["aternos_user"]
pswd = data["credentials"]["aternos_pwsd"]
channel_id = data["credentials"]["discord_channel"]
srv_ws = data["credentials"]["n_servidor"]

# Para websocket
aternos = Client.from_credentials(user, pswd)
srv_1 = aternos.list_servers()[srv_ws]  # Cambiar numero para websocket de servidor
socket = srv_1.wss()

print("Iniciando Bot")


def sesion(user, password):
	"""Función para iniciar sesion"""
	return Client.from_credentials(user, password)


def servidores(credentials):
	"""Función para obtener los servidores"""
	return credentials.list_servers()


def selec_server(srv_no, ctx):
	"""Función para seleccionar el servidor deseado"""
	try:
		srv_name = int(srv_no) - 1
	except ValueError:
		embed = discord.Embed(
			colour=discord.Colour.dark_red(),
			title="Error de tipo",
			description=f"Hola {ctx.author.name}! el índice del servidor debe ser un número entero",
		)
		return False, embed

	srv_list = servidores(sesion(user=user, password=pswd))
	i = 0
	for srv in srv_list:
		if i == srv_name:
			return srv, False
		i += 1

	# Si el servidor no se encuentra en la lista
	embed = discord.Embed(
		colour=discord.Colour.dark_red(),
		title="Error de índice",
		description=f"Hola {ctx.author.name}! el índice del servidor no se encuentra en la lista de servidores",
	)
	return False, embed


@bot.command(name="servidores", pass_context=True, help="Lists available servers",
             description="Lista de servidores disponibles")
@commands.has_role("Jugador")  # ROL
async def list_servers(ctx):
	"""Manda la lista de servidores registrados"""
	try:
		resp = []
		i = 0
		print("Request: @server_list")
		for srv in servidores(sesion(user=user, password=pswd)):
			resp.append(str(i + 1) + ": " + srv.subdomain)
			i += 1

		embed = discord.Embed(
			colour=discord.Colour.light_gray(),
			title="Servidores",
			description=f"Hola {ctx.author.name}! Los servidores registrados son: \n" + "\n".join(resp),
		)
		await ctx.reply(embed=embed)
	except IndexError:
		await ctx.send("No existe")


@bot.command(name="jugadores", pass_context=True, help="List all players on the server",
             description="Lista de jugadores del servidor")
@commands.has_role("Jugador")  # ROL
async def list_players(ctx, srv_no):
	"""Manda la lista de jugadores en el servidor"""
	try:
		srv = selec_server(srv_no, ctx)[0]
		embed_error = selec_server(srv_no, ctx)[1]
		if srv:
			players = srv.players(Lists.whl).list_players()
			embed = discord.Embed(
				colour=discord.Colour.greyple(),
				title="Jugadores",
				description=f"Hola {ctx.author.name}! Los jugadores del servidor son:",
			)
			for player in players:
				embed.add_field(name="Jugador", value=player, inline=False)
			await ctx.reply(embed=embed)
		else:
			await ctx.reply(embed=embed_error)
	except IndexError:
		await ctx.send("No existe")


@bot.command(name="estatus", pass_context=True, help="States the current state of the mentioned server")
@commands.has_role("Jugador")  # ROL
async def status(ctx, srv_no):
	"""Manda el estatus del servidor"""
	try:
		srv = selec_server(srv_no, ctx)[0]
		embed_error = selec_server(srv_no, ctx)[1]
		if srv:
			print("Request: @status " + srv.subdomain)
			if srv.status == "online":
				color = discord.Colour.red()
				estatus = "Encendido"
			elif srv.status == "loading starting":
				color = discord.Colour.yellow()
				estatus = "Cargando, espera solo un poco"
			else:
				color = discord.Colour.red()
				estatus = "Apagado\n\n Puedes encenderlo con el comando $inicio + el índice del servidor"
			embed = discord.Embed(
				colour=color,
				title="Estatus del servidor " + srv.subdomain,
				description=f"Hola {ctx.author.name}! \n El servidor está actualmente " + estatus,
			)
			await ctx.reply(embed=embed)
		else:
			await ctx.reply(embed=embed_error)
	except IndexError:
		embed = discord.Embed(
			colour=discord.Colour.dark_red(),
			title="No existe",
			description=f"Hola {ctx.author.name}! \n El índice: " + srv_no + "no existe, te puedo mostrar la lista de "
			                                                                 "servidores con el comando $servidores "
		)
		await ctx.reply(embed=embed)


@bot.command(name="inicio", pass_context=True, help="Startes the mentioned server")
@commands.has_role("Jugador")  # ROl
async def start(ctx, srv_no):
	"""Inicia el servidor"""
	try:
		srv = selec_server(srv_no, ctx)[0]
		embed_error = selec_server(srv_no, ctx)[1]
		if srv:
			print("Request: @start  " + srv.subdomain)
			if srv.status != "online":
				srv.start()
				await socket.connect()
				embed = discord.Embed(
					colour=discord.Colour.dark_green(),
					title="Encender " + srv.subdomain,
					description=f"Hola {ctx.author.name}! \nSe iniciará el servidor: " + srv.subdomain
				)
				await ctx.reply(embed=embed)
			else:
				embed = discord.Embed(
					colour=discord.Colour.green(),
					title="Encender " + srv.subdomain,
					description=f"Hola {ctx.author.name}! \nEl servidor: " + srv.subdomain + " está activo!"
				)
				await ctx.reply(embed=embed)
		else:
			await ctx.reply(embed=embed_error)
	except IndexError:
		await ctx.send("No existe")


@bot.command(name="reinicio", pass_context=True, help="restartes the mentioned server")
@commands.has_role("Administrador")  # ROL
async def restart(ctx, srv_no):
	"""Reinicia el servidor"""
	try:
		srv = selec_server(srv_no, ctx)[0]
		embed_error = selec_server(srv_no, ctx)[1]
		if srv:
			print("Request: @restart  " + srv.subdomain)
			if srv.status != "online":
				embed = discord.Embed(
					colour=discord.Colour.green(),
					title="Iniciar" + srv.subdomain,
					description=f"Hola {ctx.author.name}! \nEl servidor: " + srv.subdomain + " se iniciará"
				)
				await ctx.reply(embed=embed)
				srv.start()
			else:
				embed = discord.Embed(
					colour=discord.Colour.green(),
					title="Reiniciar" + srv.subdomain,
					description=f"Hola {ctx.author.name}! \nEl servidor: " + srv.subdomain + " se reiniciará"
				)
				await ctx.reply(embed=embed)
				srv.restart()
		else:
			await ctx.reply(embed=embed_error)
	except IndexError:
		await ctx.send("No existe")


@bot.command(name="apagar", pass_context=True, help="Stopes the mentioned server REQUIRED ROLE: MCS manager")
@commands.has_role("Administrador")  # Puedes cambiar el rol que puede parar el servidor
async def stop(ctx, srv_no):
	"""Apaga el servidor"""
	try:
		srv = selec_server(srv_no, ctx)[0]
		embed_error = selec_server(srv_no, ctx)[1]
		if srv:
			print("Request: @stop   " + srv.subdomain)
			if srv.status != "online":
				embed = discord.Embed(
					colour=discord.Colour.green(),
					title="Apagar" + srv.subdomain,
					description=f"Hola {ctx.author.name}! \nEl servidor: " + srv.subdomain + " está apagado"
				)
				await ctx.reply(embed=embed)
			else:
				embed = discord.Embed(
					colour=discord.Colour.green(),
					title="Apagar" + srv.subdomain,
					description=f"Hola {ctx.author.name}! \nEl servidor: " + srv.subdomain + " se apagagará"
				)
				await ctx.reply(embed=embed)
				srv.stop()
		else:
			await ctx.reply(embed=embed_error)
	except IndexError:
		await ctx.send("No existe")


@bot.command(name="info", pass_context=True, help="States the information about the mentioned server")
@commands.has_role("Jugador")  # ROL
async def getinfo(ctx, srv_no):
	"""Retorna la principal información del servidor"""
	try:
		srv = selec_server(srv_no, ctx)[0]
		embed_error = selec_server(srv_no, ctx)[1]
		if srv:
			embed = discord.Embed(
				colour=discord.Colour.blue(),
				title="Información del servidor: " + srv.subdomain,
				# description=f"Hola {ctx.author.name}! \nAqui está la información del servidor"
			)
			embed.add_field(name="Nombre", value=srv.subdomain, inline=False)
			embed.add_field(name="Dominio", value=srv.domain, inline=False)
			embed.add_field(name="Estatus", value=srv.status)
			embed.add_field(name="Puerto", value=str(srv.port))
			if srv.edition == atserver.Edition.bedrock:
				embed.add_field(name="Edición", value="Bedrock")
			else:
				embed.add_field(name="Edición", value="Java")
			embed.add_field(name="Minecraft", value=srv.software + srv.version, inline=False)
			await ctx.reply(embed=embed)
			print("Request: @getinfo")
			print('*** ' + srv.domain + ' ***' + '\n' +
			      '*** Address: ' + srv.address + ' ***' + '\n' +
			      '*** Status: ' + srv.status + ' ***' + '\n' +
			      '*** Port: ' + str(srv.port) + ' ***' + '\n' +
			      '*** Name: ' + srv.subdomain + ' ***' + '\n' +
			      '*** Minecraft: ' + srv.software + srv.version + ' ***' + '\n' +
			      '*** Bedrock: ' + str(srv.edition == atserver.Edition.bedrock) + ' ***' + '\n' +
			      '*** Java: ' + str(srv.edition == atserver.Edition.java) + ' ***')
		else:
			await ctx.reply(embed=embed_error)
	except IndexError:
		await ctx.send("No existe")


@bot.event  # para eventos
async def on_command_error(ctx, error):
	print(ctx)
	if isinstance(error, (commands.MissingRole, commands.MissingAnyRole)):
		await ctx.reply(embed=discord.Embed(
			colour=discord.Colour.red(),
			title="No tienes permiso"
		))
	elif isinstance(error, commands.CommandNotFound):
		await ctx.reply(embed=discord.Embed(
			colour=discord.Colour.red(),
			title="El comando no existe"
			# description=f"Hola {ctx.author.name}! \nAqui está la información del servidor"
		))
	elif isinstance(error, commands.MissingRequiredArgument):
		await ctx.reply(embed=discord.Embed(
			colour=discord.Colour.red(),
			title="Menciona un servidor",
			description="Ej: " + prefix + "inicio 1"
		))
	else:
		await ctx.reply(embed=discord.Embed(
			colour=discord.Colour.red(),
			title="Error",
		))
		print(error)


@socket.wssreceiver(atwss.Streams.console)
async def console(msg):
	"""Función que retorna la consola de aternos al iniciar y apagarse, para verla completa imprime msg"""
	print(msg)
	if 'Done' in msg:
		# if 'Timings Reset' in msg:      # Si no funciona con Timings reset, cambialo a Done
		embed = discord.Embed(
			colour=discord.Colour.green(),
			title="El servidor " + srv_1.subdomain + " está encendido",
			description="¡BUENA SUERTE!"
		)
		await bot.get_channel(channel_id).send(embed=embed)
	if 'Stopping server' in msg:
		embed = discord.Embed(
			colour=discord.Colour.red(),
			title="El servidor " + srv_1.subdomain + " se apagó"
		)
		await bot.get_channel(channel_id).send(embed=embed)


# Mensaje cuando el bot está en linea
@bot.event
async def on_ready():
	embed = discord.Embed(
		colour=discord.Colour.purple(),
		title="El Bot está en linea!",
		description="Estos son sus comandos:"
	)
	embed.add_field(name=prefix + "servidores", value="Muestra la lista de servidores", inline=False)
	embed.add_field(name=prefix + "info [n° de servidor]", value="Muestra la información del servidor seleccionado",
	                inline=False)
	embed.add_field(name=prefix + "estatus [n° de servidor]", value="Muestra el estatus del servidor seleccionado ",
	                inline=False)
	embed.add_field(name=prefix + "inicio [n° de servidor]", value="Inicia el servidor seleccionado (tendras que "
	                                                               "esperar a que arranque. cuando se inicie por "
	                                                               "completo te avisará) ", inline=False)
	embed.add_field(name=prefix + "jugadores [n° de servidor]", value="Muestra a los jugadores registrados del servidor", inline=False)
	await bot.get_channel(channel_id).send(embed=embed)


# corre el bot con la llave de discord
bot.run(secret_key)

This is the pip list:

Package                   Version
------------------------- -----------
aiohttp                   3.8.3
aiosignal                 1.2.0
async-timeout             4.0.2
attrs                     22.1.0
certifi                   2022.9.24
charset-normalizer        2.1.1
cloudscraper              1.2.64
discord                   2.0.0
discord-components-mirror 2.1.5
discord.py                2.1.1
frozenlist                1.3.1
idna                      3.4
Js2Py                     0.71
lxml                      4.9.1
multidict                 6.0.2
pip                       21.1.2
pyjsparser                2.7.1
pyparsing                 3.0.9
python-aternos            2.1.3
pytz-deprecation-shim     0.1.0.post0
regex                     2022.9.13
requests                  2.28.1
requests-toolbelt         0.9.1
setuptools                57.0.0
six                       1.16.0
tzdata                    2022.2
tzlocal                   4.2
unsync                    1.4.0
urllib3                   1.26.12
utils                     1.0.1
websockets                10.3
wheel                     0.36.2
yarl                      1.8.1

I'm starting to program with python, I've been 6 months, sorry if there is something wrong

Varo1234 avatar Feb 24 '23 07:02 Varo1234