You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:02:32