1
Fork 0
mirror of https://github.com/RGBCube/minearchy-bot synced 2025-07-27 08:57:46 +00:00

Move bot class location and fix some bugs

This commit is contained in:
RGBCube 2022-11-27 12:12:50 +03:00
parent 577b7ce131
commit 66e766d5ff
7 changed files with 122 additions and 117 deletions

View file

@ -1 +1,101 @@
from .core import * from __future__ import annotations
__all__ = ("MinearchyBot",)
from asyncio import run as run_coro
from inspect import cleandoc as strip_doc
from itertools import chain as chain_iter
from pathlib import Path
from time import time as current_time
from traceback import format_exc as format_exit
from aiohttp import ClientSession as AIOHTTPSession
from discord import AllowedMentions, Game, Intents, Webhook
from discord.ext.commands import (
Bot as CommandsBot,
ExtensionFailed,
NoEntryPointError,
when_mentioned_or,
)
from .minecraft_server import GeyserServer
from .util import override
class MinearchyBot(CommandsBot):
ready_timestamp: float
log_webhook: Webhook
def __init__(self, *, token: str, webhook_url: str) -> None:
self.token = token
self.webhook_url = webhook_url
self.server = GeyserServer(
java_ip="play.landsofminearchy.com",
bedrock_ip="bedrock.landsofminearchy.com",
)
super().__init__(
command_prefix=when_mentioned_or("="),
strip_after_prefix=True,
case_insensitive=True,
status=Game("on play.landsofminearchy.com"),
owner_ids={512640455834337290, 160087716757897216},
allowed_mentions=AllowedMentions.none(),
max_messages=100,
intents=Intents(
guilds=True,
members=True,
messages=True,
message_content=True,
),
help_attrs=dict(
brief="Sends help.",
help="Sends all the commands of the bot, or help of a specific command or module.",
),
)
@override
async def on_ready(self) -> None:
print(
strip_doc(
f"""
Connected to Discord!
User: {self.user}
ID: {self.user.id}
"""
)
)
self.ready_timestamp = current_time()
await self.log_webhook.send("Bot is now online!")
async def load_extensions(self) -> None:
cogs = Path(__file__).parent / "cogs"
for file_name in chain_iter(
map(
lambda file_path: ".".join(file_path.relative_to(cogs.parent.parent).parts)[:-3],
cogs.rglob("*.py"),
),
("jishaku",),
):
try:
await self.load_extension(file_name)
print(f"Loaded {file_name}")
except (ExtensionFailed, NoEntryPointError):
print(f"Couldn't load {file_name}:\n{format_exit()}")
@override
def run(self) -> None:
async def runner() -> None:
async with self, AIOHTTPSession() as self.session:
self.log_webhook = Webhook.from_url(
self.webhook_url, session=self.session, bot_token=self.token
)
await self.load_extensions()
await self.start(self.token, reconnect=True)
try:
run_coro(runner())
except KeyboardInterrupt:
pass

View file

@ -3,6 +3,7 @@ from __future__ import annotations
from contextlib import suppress as suppress_error from contextlib import suppress as suppress_error
from traceback import format_exception as format_exit from traceback import format_exception as format_exit
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from asyncio import gather as await_parallel
from discord import HTTPException from discord import HTTPException
from discord.ext.commands import ( from discord.ext.commands import (
@ -19,7 +20,7 @@ from discord.ext.commands import (
if TYPE_CHECKING: if TYPE_CHECKING:
from discord.ext.commands import CommandError, Context from discord.ext.commands import CommandError, Context
from ..core import MinearchyBot from .. import MinearchyBot
class ErrorHandler(Cog): class ErrorHandler(Cog):
@ -62,7 +63,12 @@ class ErrorHandler(Cog):
else: else:
trace = "".join(format_exit(type(error), error, error.__traceback__)) trace = "".join(format_exit(type(error), error, error.__traceback__))
print(f"Ignoring exception in command {ctx.command}:\n{trace}") print(f"Ignoring exception in command {ctx.command}:\n{trace}")
await self.bot.log_webhook.send(f"<@512640455834337290>```{trace}```") await await_parallel(
self.bot.log_webhook.send(f"<@512640455834337290>```{trace}```"),
ctx.reply(
"An error occurred while executing the command. The error has been reported."
),
)
async def setup(bot: MinearchyBot) -> None: async def setup(bot: MinearchyBot) -> None:

View file

@ -8,7 +8,7 @@ from discord.ui import Button, View
if TYPE_CHECKING: if TYPE_CHECKING:
from discord.ext.commands import Context from discord.ext.commands import Context
from ..core import MinearchyBot from .. import MinearchyBot
class MinecraftServer( class MinecraftServer(

View file

@ -17,7 +17,7 @@ if TYPE_CHECKING:
from discord import Message from discord import Message
from discord.ext.commands import Context from discord.ext.commands import Context
from ..core import MinearchyBot from .. import MinearchyBot
class Miscellaneous( class Miscellaneous(
@ -72,7 +72,8 @@ class Miscellaneous(
self.sniped[message.channel.id].appendleft((message, int(current_time()))) self.sniped[message.channel.id].appendleft((message, int(current_time())))
self.sniped[message.channel.id] = self.sniped[message.channel.id][:5] # type: ignore while len(self.sniped[message.channel.id]) > 5:
self.sniped[message.channel.id].pop()
@command( @command(
brief="Sends the latest deleted messages.", brief="Sends the latest deleted messages.",
@ -82,7 +83,7 @@ class Miscellaneous(
), ),
) )
@has_permissions(manage_messages=True) # needs to be able to delete messages to run the command @has_permissions(manage_messages=True) # needs to be able to delete messages to run the command
async def snipe(self, ctx: Context, channel: TextChannel = None) -> None: # type: ignore async def snipe(self, ctx: Context, channel: TextChannel = None) -> None:
if channel is None: if channel is None:
channel = ctx.channel channel = ctx.channel

View file

@ -7,7 +7,7 @@ from discord import Member
from discord.ext.commands import Cog, Context, command, has_permissions from discord.ext.commands import Cog, Context, command, has_permissions
if TYPE_CHECKING: if TYPE_CHECKING:
from ..core import MinearchyBot from .. import MinearchyBot
class Moderation(Cog): class Moderation(Cog):

View file

@ -1 +0,0 @@
from .minearchy_bot import *

View file

@ -1,101 +0,0 @@
from __future__ import annotations
__all__ = ("MinearchyBot",)
from asyncio import run as run_coro
from inspect import cleandoc as strip_doc
from itertools import chain as chain_iter
from pathlib import Path
from time import time as current_time
from traceback import format_exc as format_exit
from aiohttp import ClientSession as AIOHTTPSession
from discord import AllowedMentions, Game, Intents, Webhook
from discord.ext.commands import (
Bot as CommandsBot,
ExtensionFailed,
NoEntryPointError,
when_mentioned_or,
)
from ..minecraft_server import GeyserServer
from ..util import override
class MinearchyBot(CommandsBot):
ready_timestamp: float
log_webhook: Webhook
def __init__(self, *, token: str, webhook_url: str) -> None:
self.token = token
self.webhook_url = webhook_url
self.server = GeyserServer(
java_ip="play.landsofminearchy.com",
bedrock_ip="bedrock.landsofminearchy.com",
)
super().__init__(
command_prefix=when_mentioned_or("="),
strip_after_prefix=True,
case_insensitive=True,
status=Game("on play.landsofminearchy.com"),
owner_ids={512640455834337290, 160087716757897216},
allowed_mentions=AllowedMentions.none(),
max_messages=100,
intents=Intents(
guilds=True,
members=True,
messages=True,
message_content=True,
),
help_attrs=dict(
brief="Sends help.",
help="Sends all the commands of the bot, or help of a specific command or module.",
),
)
@override
async def on_ready(self) -> None:
print(
strip_doc(
f"""
Connected to Discord!
User: {self.user}
ID: {self.user.id}
"""
)
)
self.ready_timestamp = current_time()
await self.log_webhook.send("Bot is now online!")
async def load_extensions(self) -> None:
cogs = Path(__file__).parent.parent / "cogs"
for file_name in chain_iter(
map(
lambda file_path: ".".join(file_path.relative_to(cogs.parent.parent).parts)[:-3],
cogs.rglob("*.py"),
),
("jishaku",),
):
try:
await self.load_extension(file_name)
print(f"Loaded {file_name}")
except (ExtensionFailed, NoEntryPointError):
print(f"Couldn't load {file_name}:\n{format_exit()}")
@override
def run(self) -> None:
async def runner() -> None:
async with self, AIOHTTPSession() as self.session:
self.log_webhook = Webhook.from_url(
self.webhook_url, session=self.session, bot_token=self.token
)
await self.load_extensions()
await self.start(self.token, reconnect=True)
try:
run_coro(runner())
except KeyboardInterrupt:
pass