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:
parent
577b7ce131
commit
66e766d5ff
7 changed files with 122 additions and 117 deletions
|
@ -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
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
@ -113,13 +114,13 @@ class Miscellaneous(
|
||||||
name=str(i) + ("" if i else " (latest)"),
|
name=str(i) + ("" if i else " (latest)"),
|
||||||
value=strip_doc(
|
value=strip_doc(
|
||||||
f"""
|
f"""
|
||||||
Author: {message.author.mention} (ID: {message.author.id}, Plain: {escape_markdown(str(message.author))})
|
Author: {message.author.mention} (ID: {message.author.id}, Plain: {escape_markdown(str(message.author))})
|
||||||
Deleted at: <t:{ts}:F> (Relative: <t:{ts}:R>)
|
Deleted at: <t:{ts}:F> (Relative: <t:{ts}:R>)
|
||||||
Content:
|
Content:
|
||||||
```
|
```
|
||||||
{message.content.replace('`', f'{zwsp}`{zwsp}')}
|
{message.content.replace('`', f'{zwsp}`{zwsp}')}
|
||||||
```
|
```
|
||||||
"""
|
"""
|
||||||
),
|
),
|
||||||
inline=False,
|
inline=False,
|
||||||
)
|
)
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
from .minearchy_bot import *
|
|
|
@ -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
|
|
Loading…
Add table
Add a link
Reference in a new issue