SeaCogs/pterodactyl/pterodactyl.py
SeaswimmerTheFsh 6158d05960
All checks were successful
Actions / Lint Code (Ruff) (pull_request) Successful in 9s
Actions / Build Documentation (MkDocs) (pull_request) Successful in 24s
feat(pterodactyl): introduced the cog
2024-02-27 23:02:03 -05:00

61 lines
2.3 KiB
Python

import json
import logging
import websockets
from pydactyl import PterodactylClient, exceptions
from redbot.core import Config, commands
from redbot.core.bot import Red
class Pterodactyl(commands.Cog):
"""Pterodactyl allows you to manage your Pterodactyl Panel from Discord."""
def __init__(self, bot: Red):
self.bot = bot
self.config = Config.get_conf(self, identifier=457581387213637448123567)
self.config.register_global(
base_url='https://mc.bloom.host',
api_key='ptlc_G1leFiGsBXeo4lkRasXOMUJhE1aXnygQmg2AKgLKNjk',
server_id='5756a968',
startup_jar=None,
startup_arguments=None,
power_action_in_progress=False
)
self.logger = logging.getLogger('red.sea.pterodactyl')
self.client = None
self.websocket = None
async def establish_websocket_connection(self, base_url, api_key, server_id):
try:
client = PterodactylClient(base_url, api_key).client
websocket_credentials = client.servers.get_websocket(server_id)
except exceptions.ClientConfigError as e:
self.logger.error(f'Failed to initialize Pterodactyl client: {e}')
return
except exceptions.PterodactylApiError as e:
self.logger.error(f'Failed to retrieve Pterodactyl websocket: {e}')
return
async with websockets.connect(websocket_credentials['data']['socket']) as websocket:
self.logger.debug("WebSocket connection established")
# Send authentication token
auth_message = json.dumps({"event": "auth", "args": websocket_credentials['data']['token']})
await websocket.send(auth_message)
self.logger.debug("Authentication message sent")
self.client = client
self.websocket = websocket
while True:
message = await websocket.recv()
self.logger.debug("Received message: %s", message)
async def cog_load(self):
base_url = await self.config.base_url()
api_key = await self.config.api_key()
server_id = await self.config.server_id()
await self.establish_websocket_connection(base_url, api_key, server_id)
async def cog_unload(self):
await self.client._session.close()