刚刚开始学习如何使用在线视频制作不和谐机器人。目前,当我尝试将斜杠命令同步到调试服务器时,斜杠命令不会显示。
import settings
import discord
import sqlite3
from discord.ext import commands
from discord import app_commands
logger = settings.logging.getLogger("bot")
def is_owner(interaction: discord.Interaction):
return str(interaction.user.id) == settings.OWNER_ID
def TableExists(dbcon, table_name):
dbcur = dbcon.cursor()
dbcur.execute(f"SELECT name FROM sqlite_master WHERE type = 'table' AND name = '{table_name}'")
if len(dbcur.fetchall()) >= 1:
dbcur.close()
return True
dbcur.close()
return False
def run():
intents = discord.Intents.all()
bot = commands.Bot(command_prefix="/", intents=intents)
@bot.hybrid_command()
async def sync(ctx):
logger.info("Syncing slash commands...")
bot.tree.copy_global_to(guild=ctx.guild)
commands = await bot.tree.sync(guild=settings.GUILDS_ID)
logger.info(f"Registered commands: {commands}")
@bot.tree.command(description = "Reload Bot Extensions (Owner only)",)
@app_commands.check(is_owner)
async def reload(interaction: discord.Interaction, cog: str = None):
reloaded = True
if cog is None:
logger.info("Attempting to reload extensions...")
for cog_file in settings.COGS_DIR.glob("*.py"):
if cog_file != "__init__.py":
extension_name = cog_file.name[:-3]
try:
await bot.reload_extension(f"cogs.{extension_name}")
except Exception as e:
logger.error(f"Failed to reload extension: {e}")
reloaded = False
else:
try:
logger.info("Attempting to reload extensions...")
await bot.reload_extension(f"cogs.{cog.lower()}")
except Exception as e:
logger.error(f"Failed to reload extension: {e}")
reloaded = False
if reloaded:
logger.info("Extensions reloaded successfully!")
await interaction.response.send_message("Extensions reloaded", ephemeral=True)
else:
logger.info("Extensions failed to reload...")
await interaction.response.send_message("Extensions failed to reload", ephemeral=True)
bot.tree.copy_global_to(guild = settings.GUILDS_ID)
bot.tree.clear_commands(guild = settings.GUILDS_ID)
await bot.tree.sync(guild = settings.GUILDS_ID)
bot.tree.clear_commands(guild = None)
await bot.tree.sync()
@reload.error
async def say_error(interaction: discord.Integration, error):
await interaction.response.send_message("You do not have permission to use this command", ephemeral=True)
@bot.event
async def on_ready():
logger.info(f"User: {bot.user} (ID: {bot.user.id})")
logger.info("Initialising database...")
conn = sqlite3.connect(f"{settings.DBS_DIR}\\boxbot.db")
cursor = conn.cursor()
cursor.execute("DROP TABLE Rps")
cursor.execute("DROP TABLE Slap")
cursor.execute("DROP TABLE Ping")
cursor.execute("DROP TABLE Member")
cursor.execute("DROP TABLE Guild")
if not(TableExists(conn, "Guild")):
cursor.execute("""CREATE TABLE Guild (
guildID INT,
guildname VARCHAR(255),
sfw INT,
PRIMARY KEY (guildID)
)""")
if not(TableExists(conn, "Member")):
cursor.execute("""CREATE TABLE Member (
memberID INT,
guildID INT,
membername VARCHAR(255),
PRIMARY KEY (memberID, guildID),
FOREIGN KEY(guildID) REFERENCES Guild(guildID)
)""")
if not(TableExists(conn, "Ping")):
cursor.execute("""CREATE TABLE Ping (
pingerID INT,
pingerGID INT,
count INT,
PRIMARY KEY (pingerID),
FOREIGN KEY(pingerID) REFERENCES Member(memberID)
)""")
if not(TableExists(conn, "Slap")):
cursor.execute("""CREATE TABLE Slap (
slapperID INT,
slapperGID INT,
slappedID INT,
count INT,
PRIMARY KEY (slapperID, slapperGID),
FOREIGN KEY(slapperID, slapperGID, slappedID) REFERENCES Member(memberID, guildID, memberID)
)""")
if not(TableExists(conn, "Rps")):
cursor.execute("""CREATE TABLE Rps (
playerID INT,
playerGID INT,
won INT,
loss INT,
draw INT,
PRIMARY KEY (playerID, playerGID),
FOREIGN KEY(playerID, playerGID) REFERENCES Member(memberID, guildID)
)""")
cursor.execute("SELECT guildID FROM Guild")
guilds = [guildID[0] for guildID in cursor.fetchall()]
for guild in bot.guilds:
if guild.id not in guilds:
cursor.execute("INSERT INTO Guild (guildID, guildname, sfw) VALUES (?, ?, ?)", (guild.id, guild.name, 0))
for member in guild.members:
cursor.execute("SELECT memberID FROM Member")
members = [memberID[0] for memberID in cursor.fetchall()]
if member.id != bot.user.id and member.id not in members:
cursor.execute("INSERT INTO Member (memberID, guildID, membername) VALUES (?, ?, ?)", (member.id, guild.id, member.name))
conn.commit()
logger.info("Initialised database!")
for cog_file in settings.COGS_DIR.glob("*.py"):
if cog_file != "__init__.py":
extension_name = cog_file.name[:-3]
try:
logger.info(f"Attempting to load extension: {extension_name}...")
await bot.load_extension(f"cogs.{extension_name}")
logger.info(f"Extension {extension_name} loaded successfully!")
except Exception as e:
logger.error(f"Failed to load extension, {extension_name}: {e}")
bot.tree.copy_global_to(guild = settings.GUILDS_ID)
bot.tree.clear_commands(guild = settings.GUILDS_ID)
await bot.tree.sync(guild = settings.GUILDS_ID)
bot.tree.clear_commands(guild = None)
await bot.tree.sync()
conn.close()
logger.info(f"{bot.user} has booted!")
bot.run(settings.DISCORD_TOKEN, root_logger = True)
if __name__ == "__main__":
run()
我尝试使用混合命令同步它们,甚至将其放入
on_ready
本身,但它似乎不起作用......
我的 /sync 命令的输出返回以下内容:
Registered commands: []
附注斜线命令之前确实有效,但是,这个问题只是在我开始向我的 Cogs 添加更多命令后才出现。
@bot.command()
async def clearcache(ctx):
bot.command_prefix = "!" # Change this to your actual command prefix
await bot.http.clear_application_commands(bot.user.id, bot.token)
await ctx.send("Command cache cleared.")
运行此命令,然后再次尝试同步。如果您仍然遇到问题,请分享更多详细信息或代码,以便我们更好地提供帮助。