discord.py成就与升级消息无法发送至指定频道问题求助
Discord Bot 问题:等级提升与成就消息无法发送至指定频道
- 用户达到特定等级时,成就消息无法发送至预设的
xp_channel_id频道 - 用户升级时的等级提升消息未按预期发送到指定频道
已尝试的排查手段
- 添加调试代码
- 修改
on_message与achievement函数 - 移除
on_ready函数
相关代码片段
import discord from discord.ext import commands import json import os import asyncio import random intents = discord.Intents.default() intents.messages = True intents.guilds = True intents.guild_messages = True intents.message_content = True bot = commands.Bot(command_prefix="!", intents=intents) xp_channel_id = 1187555795899011143 config_file = "config.json" processed_messages = set() # Carregar configurações do arquivo se existir if os.path.exists(config_file): with open(config_file, "r") as f: config = json.load(f) for user_id, xp_data in config.get("XP", {}).items(): level = int(xp_data.get("level", 1)) xp = int(xp_data.get("xp", 0)) config["XP"][user_id] = {"level": level, "xp": xp} for user_id, achievements in config.get("Achievements", {}).items(): config["Achievements"][user_id] = achievements else: config = {"XP": {}, "Achievements": {}} def save_config(): with open(config_file, "w") as f: json.dump(config, f, indent=4) async def achievement(user_id, achievement_name): if user_id not in config["Achievements"]: config["Achievements"][user_id] = [] config["Achievements"][user_id].append(achievement_name) save_config() async def send_level_up_message(ctx, user, level): try: await ctx.send(f"Parabéns, {user.mention}! Você está agora no nível {level}!") except Exception as e: print(f"Failed to send level up message to {user.name}, level {level}") print(f"Error: {e}") async def check_level(user, ctx, new_level): user = user or ctx.author user_id = str(user.id) old_level = config["XP"].get(user_id, {}).get("level", 1) if new_level > old_level: config["XP"][user_id]["level"] = new_level save_config() await send_level_up_message(ctx, user, new_level) if new_level == 2 and old_level < 2: await achievement(user_id, f"{user.mention} Conquista desbloqueada🏆.\n 'De novato a... Menos novato?'") if new_level == 5 and old_level < 5: await achievement(user_id, f"{user.mention} Conquista desbloqueada🏆.\n 'Top 5! (Brincadeira, é o Nível 5')") @bot.event async def on_ready(): print(f'Bot conectado como {bot.user.name}') config["last_message_id"] = bot.get_channel(xp_channel_id).last_message_id save_config() @bot.event async def on_disconnect(): print("Bot desconectado") @bot.event async def on_message(message): if ( not message.author.bot and not message.content.startswith(bot.command_prefix) and message.id not in processed_messages ): user_id = str(message.author.id) user_data = config["XP"].get(user_id, {"xp": 0, "level": 1}) user_data["xp"] += 1 processed_messages.add(message.id) save_config() new_level = calculate_level(user_data["xp"]) user_data["level"] = new_level config["XP"][user_id] = user_data await check_level(message.author, message.channel, new_level) await bot.process_commands(message) @bot.command(name='ShowXP') async def show_xp(ctx, user: discord.User = None): user = user or ctx.author if user.bot: return xp_data = config["XP"].get(str(user.id), {"xp": 0, "level": 1}) xp = xp_data["xp"] level = calculate_level(xp) message = f'{user.mention} está no nível {level} com {xp} de XP! Continue assim 🎉' await ctx.send(message) @bot.command(name='ResetXP') async def reset_xp(ctx): if not await is_allowed_user(ctx.author): return user_id = str(ctx.author.id) config["XP"][user_id]['xp'] = 0 save_config() await ctx.message.delete() @bot.command(name="TopServer") async def top10(ctx): top_users = sorted(config["XP"].items(), key=lambda x: x[1]["xp"], reverse=True) while len(top_users) < 10: top_users.append(('0', {"xp": 0, "level": 0})) embed = discord.Embed(title="Top 10 do server!", color=0xFF0000) for rank, (user_id, xp_data) in enumerate(top_users[:10], start=1): try: user = await bot.fetch_user(int(user_id)) rank_emoji = '🥇' if rank == 1 else ('🥈' if rank == 2 else ('🥉' if rank == 3 else '')) embed.add_field(name=f"{rank_emoji} {rank}. {user.display_name}", value=f"{xp_data['xp']} XP", inline=False) except discord.errors.NotFound: embed.add_field(name=f"{rank}. **_User Not Found_**", value=f"{xp_data['xp']} XP", inline=False) await ctx.send(embed=embed) @bot.command(name='Joke') async def tell
内容的提问来源于stack exchange,提问作者d4v1l44
相关产品推荐
相关产品推荐

