Merge pull request #8 from official-Cromatin:refractor/remove-portal-class
Refractor: Remove portal class
This commit was merged in pull request #8.
This commit is contained in:
@@ -0,0 +1 @@
|
|||||||
|
0.5.2
|
||||||
+4
-6
@@ -4,7 +4,6 @@ from discord.ext import commands
|
|||||||
from cogs.base_cog import Base_Cog
|
from cogs.base_cog import Base_Cog
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
from utils.portal import Portal
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from utils.datetime_tools import get_elapsed_time_big
|
from utils.datetime_tools import get_elapsed_time_big
|
||||||
from utils.logger.decorator import log_command_execution
|
from utils.logger.decorator import log_command_execution
|
||||||
@@ -17,17 +16,16 @@ class Debug_Command(Base_Cog):
|
|||||||
@app_commands.command(name = "debug", description = "Provides debug informations about the bot, useful for troubleshooting")
|
@app_commands.command(name = "debug", description = "Provides debug informations about the bot, useful for troubleshooting")
|
||||||
@log_command_execution
|
@log_command_execution
|
||||||
async def debug(self, ctx:discord.Interaction):
|
async def debug(self, ctx:discord.Interaction):
|
||||||
portal:Portal = Portal.instance()
|
|
||||||
embed = discord.Embed(title="Debug Information")
|
embed = discord.Embed(title="Debug Information")
|
||||||
|
|
||||||
embed.add_field(name="Version",
|
embed.add_field(name="Version",
|
||||||
value=f"`{portal.PROGRAM_VERSION}`",
|
value=ctx.client.VERSION,
|
||||||
inline=True)
|
inline=True)
|
||||||
embed.add_field(name="Uptime",
|
embed.add_field(name="Uptime",
|
||||||
value=f"{get_elapsed_time_big(datetime.now().timestamp() - portal.STARTUP_TIMESTAMP)}",
|
value=f"{get_elapsed_time_big(datetime.now().timestamp() - ctx.client.STARTUP_TIMESTAMP)}",
|
||||||
inline=True)
|
inline=True)
|
||||||
embed.add_field(name="Bot Owner",
|
embed.add_field(name="Bot Owner",
|
||||||
value=f"<@{portal.bot_config['DISCORD']['OWNER_ID']}>",
|
value=f"<@{ctx.client.bot_config['DISCORD']['OWNER_ID']}>",
|
||||||
inline=True)
|
inline=True)
|
||||||
embed.add_field(name="Latency to Gateway",
|
embed.add_field(name="Latency to Gateway",
|
||||||
value=f"{round(self.__bot.latency * 1000, 2)}ms",
|
value=f"{round(self.__bot.latency * 1000, 2)}ms",
|
||||||
@@ -38,7 +36,7 @@ class Debug_Command(Base_Cog):
|
|||||||
embed.add_field(name="Number of Guilds",
|
embed.add_field(name="Number of Guilds",
|
||||||
value=f"{len(self.__bot.guilds)}",
|
value=f"{len(self.__bot.guilds)}",
|
||||||
inline=True)
|
inline=True)
|
||||||
embed.add_field(name = "Number of executed commands", value=f"Total: {portal.no_executed_commands}\nSucceeded: {portal.no_succeeded_commands}\nFailed: {portal.no_failed_commands}")
|
embed.add_field(name = "Number of executed commands", value=f"Total: {ctx.client.no_executed_commands}\nSucceeded: {ctx.client.no_succeeded_commands}\nFailed: {ctx.client.no_failed_commands}")
|
||||||
|
|
||||||
await ctx.response.send_message(embed=embed)
|
await ctx.response.send_message(embed=embed)
|
||||||
|
|
||||||
|
|||||||
+1
-4
@@ -6,7 +6,6 @@ from cogs.base_cog import Base_Cog
|
|||||||
import logging
|
import logging
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
from asyncpraw.models import Submission
|
from asyncpraw.models import Submission
|
||||||
from utils.portal import Portal
|
|
||||||
import aiohttp
|
import aiohttp
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
@@ -35,14 +34,12 @@ class Post_Command(Base_Cog):
|
|||||||
async def post(self, ctx:discord.Interaction, url:str, custom_note:str = None, use_title:bool = True, quality:app_commands.Choice[int] = 95):
|
async def post(self, ctx:discord.Interaction, url:str, custom_note:str = None, use_title:bool = True, quality:app_commands.Choice[int] = 95):
|
||||||
try:
|
try:
|
||||||
domain_info = urlparse(url)
|
domain_info = urlparse(url)
|
||||||
portal = Portal.instance()
|
|
||||||
toplevel_domain = '.'.join(domain_info.netloc.split('.')[-2:])
|
toplevel_domain = '.'.join(domain_info.netloc.split('.')[-2:])
|
||||||
begin_process = datetime.now().timestamp()
|
begin_process = datetime.now().timestamp()
|
||||||
match toplevel_domain:
|
match toplevel_domain:
|
||||||
case "reddit.com":
|
case "reddit.com":
|
||||||
self._logger.debug(f"Recieved command by {ctx.user} ({ctx.user.id}) for reddit ({url})")
|
self._logger.debug(f"Recieved command by {ctx.user} ({ctx.user.id}) for reddit ({url})")
|
||||||
|
subm:Submission = await ctx.client.reddit_adapter.fetch(url)
|
||||||
subm:Submission = await portal.reddit_adapter.fetch(url)
|
|
||||||
image_urls = []
|
image_urls = []
|
||||||
# Check if submission has a gallery
|
# Check if submission has a gallery
|
||||||
if hasattr(subm, "media_metadata"):
|
if hasattr(subm, "media_metadata"):
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
# Read VERSION file
|
||||||
|
with open(Path(__file__).resolve().parent / "VERSION") as f:
|
||||||
|
VERSION = f.read().strip()
|
||||||
|
|
||||||
|
|
||||||
|
__all__ = VERSION
|
||||||
+21
-20
@@ -9,16 +9,16 @@ from pathlib import Path
|
|||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
import traceback
|
import traceback
|
||||||
from utils.portal import Portal
|
|
||||||
import asyncio
|
import asyncio
|
||||||
from typing import Union
|
from typing import Union
|
||||||
from platforms.reddit import Reddit_Adapter
|
from platforms.reddit import Reddit_Adapter
|
||||||
|
from const import VERSION
|
||||||
|
|
||||||
print(" ____ ____ ___________ __________")
|
print(" ____ ____ ___________ __________")
|
||||||
print(" / __ \/ __ \/ ___/_ __/ / _/_ __/")
|
print(" / __ \/ __ \/ ___/_ __/ / _/_ __/")
|
||||||
print(" / /_/ / / / /\__ \ / /_____ / / / / ")
|
print(" / /_/ / / / /\__ \ / /_____ / / / / ")
|
||||||
print(" / ____/ /_/ /___/ // /_____// / / / ")
|
print(" / ____/ /_/ /___/ // /_____// / / / ")
|
||||||
print(" /_/ \____//____//_/ /___/ /_/ ")
|
print(f" /_/ \____//____//_/ /___/ /_/ v{VERSION}")
|
||||||
print(" Copyright (c) 2024-2025 Lars Winzer")
|
print(" Copyright (c) 2024-2025 Lars Winzer")
|
||||||
print()
|
print()
|
||||||
print(" Source: https://github.com/official-Cromatin/Post-It")
|
print(" Source: https://github.com/official-Cromatin/Post-It")
|
||||||
@@ -41,11 +41,17 @@ intents.messages = True
|
|||||||
class MyBot(commands.Bot):
|
class MyBot(commands.Bot):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__(command_prefix=None, help_command=None, intents=intents)
|
super().__init__(command_prefix=None, help_command=None, intents=intents)
|
||||||
self.__portal:Portal
|
|
||||||
self.__first_on_ready = False
|
self.__first_on_ready = False
|
||||||
|
|
||||||
def set_portal(self, portal:Portal):
|
self.VERSION = VERSION
|
||||||
self.__portal = portal
|
self.STARTUP_TIMESTAMP: float = None
|
||||||
|
self.platforms_config: Advanced_ConfigParser = None
|
||||||
|
self.bot_config: Advanced_ConfigParser = None
|
||||||
|
self.reddit_adapter: Reddit_Adapter = None
|
||||||
|
|
||||||
|
self.no_executed_commands:int = 0
|
||||||
|
self.no_succeeded_commands:int = 0
|
||||||
|
self.no_failed_commands:int = 0
|
||||||
|
|
||||||
async def setup_hook(self):
|
async def setup_hook(self):
|
||||||
# Register cogs to handle commands
|
# Register cogs to handle commands
|
||||||
@@ -55,13 +61,13 @@ class MyBot(commands.Bot):
|
|||||||
|
|
||||||
async def on_app_command_completion(self, interaction: discord.Interaction, command: Union[discord.app_commands.Command, discord.app_commands.ContextMenu]):
|
async def on_app_command_completion(self, interaction: discord.Interaction, command: Union[discord.app_commands.Command, discord.app_commands.ContextMenu]):
|
||||||
"""Called when a `app_commands.Command` or `app_commands.ContextMenu` has successfully completed without error"""
|
"""Called when a `app_commands.Command` or `app_commands.ContextMenu` has successfully completed without error"""
|
||||||
self.__portal.no_succeeded_commands += 1
|
self.no_succeeded_commands += 1
|
||||||
|
|
||||||
async def on_interaction(self, interaction: discord.Interaction):
|
async def on_interaction(self, interaction: discord.Interaction):
|
||||||
"""Called when an interaction happened"""
|
"""Called when an interaction happened"""
|
||||||
match interaction.type.name:
|
match interaction.type.name:
|
||||||
case discord.InteractionType.application_command.name:
|
case discord.InteractionType.application_command.name:
|
||||||
self.__portal.no_executed_commands += 1
|
self.no_executed_commands += 1
|
||||||
case discord.InteractionType.ping.name:
|
case discord.InteractionType.ping.name:
|
||||||
print("App got pinged by discord")
|
print("App got pinged by discord")
|
||||||
case discord.InteractionType.autocomplete.name:
|
case discord.InteractionType.autocomplete.name:
|
||||||
@@ -82,13 +88,13 @@ class MyBot(commands.Bot):
|
|||||||
task_start = datetime.now().timestamp()
|
task_start = datetime.now().timestamp()
|
||||||
startup_logger.debug("Loading platforms config ...")
|
startup_logger.debug("Loading platforms config ...")
|
||||||
platforms_config = Advanced_ConfigParser(Path.joinpath(base_path, "config", "platforms.ini"))
|
platforms_config = Advanced_ConfigParser(Path.joinpath(base_path, "config", "platforms.ini"))
|
||||||
portal.platforms_config = platforms_config
|
self.platforms_config = platforms_config
|
||||||
startup_logger.info(f"Loaded platforms config after {get_elapsed_time_milliseconds(datetime.now().timestamp() - task_start)}")
|
startup_logger.info(f"Loaded platforms config after {get_elapsed_time_milliseconds(datetime.now().timestamp() - task_start)}")
|
||||||
|
|
||||||
# Create platforms adapter
|
# Create platforms adapter
|
||||||
task_start = datetime.now().timestamp()
|
task_start = datetime.now().timestamp()
|
||||||
startup_logger.debug("Creating reddit adapter ...")
|
startup_logger.debug("Creating reddit adapter ...")
|
||||||
portal.reddit_adapter = Reddit_Adapter(platforms_config["REDDIT"]["CLIENT_ID"], platforms_config["REDDIT"]["CLIENT_SECRET"])
|
self.reddit_adapter = Reddit_Adapter(platforms_config["REDDIT"]["CLIENT_ID"], platforms_config["REDDIT"]["CLIENT_SECRET"])
|
||||||
startup_logger.info(f"Created reddit adapter after {get_elapsed_time_milliseconds(datetime.now().timestamp() - task_start)}")
|
startup_logger.info(f"Created reddit adapter after {get_elapsed_time_milliseconds(datetime.now().timestamp() - task_start)}")
|
||||||
|
|
||||||
await self.change_presence(status = discord.Status.online, activity = None)
|
await self.change_presence(status = discord.Status.online, activity = None)
|
||||||
@@ -101,22 +107,17 @@ class MyBot(commands.Bot):
|
|||||||
app_logger.info(f"Successfully logged in (after {get_elapsed_time_smal(datetime.now().timestamp() - startup)}) as {self.user}")
|
app_logger.info(f"Successfully logged in (after {get_elapsed_time_smal(datetime.now().timestamp() - startup)}) as {self.user}")
|
||||||
|
|
||||||
bot = MyBot()
|
bot = MyBot()
|
||||||
bot_config = Advanced_ConfigParser(Path.joinpath(base_path, "config", "bot.ini"))
|
bot.STARTUP_TIMESTAMP = startup
|
||||||
if re.match(r'[A-Za-z\d]{24}\.[\w-]{6}\.[\w-]{27}', bot_config["DISCORD"]["TOKEN"]):
|
bot.bot_config = Advanced_ConfigParser(Path.joinpath(base_path, "config", "bot.ini"))
|
||||||
|
if re.match(r'[A-Za-z\d]{24}\.[\w-]{6}\.[\w-]{27}', bot.bot_config["DISCORD"]["TOKEN"]):
|
||||||
app_logger.critical("Bot (config/bot.ini) configuration invalid, please set a valid token")
|
app_logger.critical("Bot (config/bot.ini) configuration invalid, please set a valid token")
|
||||||
quit(1)
|
quit(1)
|
||||||
elif bot_config.compare_to_template() not in ("equal", "config_minus"):
|
elif bot.bot_config.compare_to_template() not in ("equal", "config_minus"):
|
||||||
app_logger.critical("Bot (config/bot.ini) configuration is missing some parts. Make sure it at least has all the same keys as the template")
|
app_logger.critical("Bot (config/bot.ini) configuration is missing some parts. Make sure it at least has all the same keys as the template")
|
||||||
quit(1)
|
quit(1)
|
||||||
else:
|
else:
|
||||||
app_logger.info("Bot configuration valid, continuing with startup")
|
app_logger.info("Bot configuration valid, continuing with startup")
|
||||||
|
|
||||||
# Execute some housekeeping actions
|
|
||||||
portal = Portal.instance()
|
|
||||||
portal.bot_config = bot_config
|
|
||||||
portal.STARTUP_TIMESTAMP = startup
|
|
||||||
bot.set_portal(portal)
|
|
||||||
|
|
||||||
# Setup handlers to handle states of command execution
|
# Setup handlers to handle states of command execution
|
||||||
@bot.tree.error
|
@bot.tree.error
|
||||||
async def on_app_command_error(ctx:discord.Interaction, error):
|
async def on_app_command_error(ctx:discord.Interaction, error):
|
||||||
@@ -124,10 +125,10 @@ async def on_app_command_error(ctx:discord.Interaction, error):
|
|||||||
print('Ignoring exception in command {}:'.format(ctx.command), file=sys.stderr)
|
print('Ignoring exception in command {}:'.format(ctx.command), file=sys.stderr)
|
||||||
traceback.print_exception(type(error), error, error.__traceback__)
|
traceback.print_exception(type(error), error, error.__traceback__)
|
||||||
|
|
||||||
portal.no_failed_commands += 1
|
bot.no_failed_commands += 1
|
||||||
|
|
||||||
try:
|
try:
|
||||||
bot.run(bot_config["DISCORD"]["TOKEN"], log_handler = None)
|
bot.run(bot.bot_config["DISCORD"]["TOKEN"], log_handler = None)
|
||||||
except discord.errors.LoginFailure:
|
except discord.errors.LoginFailure:
|
||||||
app_logger.critical("Improper token has been passed. Aborting startup")
|
app_logger.critical("Improper token has been passed. Aborting startup")
|
||||||
quit(1)
|
quit(1)
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
from utils.singleton import Singleton
|
|
||||||
from utils.adv_configparser import Advanced_ConfigParser
|
|
||||||
from platforms.reddit import Reddit_Adapter
|
|
||||||
|
|
||||||
@Singleton
|
|
||||||
class Portal:
|
|
||||||
PROGRAM_VERSION = "0.3"
|
|
||||||
bot_config:Advanced_ConfigParser = None
|
|
||||||
platforms_config:Advanced_ConfigParser = None
|
|
||||||
STARTUP_TIMESTAMP:float = None
|
|
||||||
no_executed_commands:int = 0
|
|
||||||
no_succeeded_commands:int = 0
|
|
||||||
no_failed_commands:int = 0
|
|
||||||
reddit_adapter: Reddit_Adapter = None
|
|
||||||
Reference in New Issue
Block a user