簡體   English   中英

Discord Python Bot:等級和經驗系統

[英]Discord Python Bot: Levels and EXP System

所以我有一個用 Python 構建的 Discord 機器人,我為它制作了一個關卡系統。 它在大多數情況下都有效,但我遇到了兩個問題。

它的升級有點太快了,而且它同時讀取機器人和 webhooks 作為成員。

我試過調整if cur_xp >= round((4 * (cur_lvl ** 3)) / 5)語句中的數字,但它要么加快速度,要么什么都不做。

這是我的代碼:

import discord
from discord.ext import commands

import json
import asyncio


class Levels(commands.Cog):
    def __init__(self, client):
        self.client = client

        with open(r"path\to\json\file\users.json", "r") as f:
            self.users = json.load(f)

        self.client.loop.create_task(self.save_users())

    async def save_users(self):
        await self.client.wait_until_ready()
        while not self.client.is_closed():
            with open(r"path\to\json\file\users.json", "w") as f:
                json.dump(self.users, f, indent=4)

            await asyncio.sleep(5)

    def lvl_up(self, author_id):
        cur_xp = self.users[author_id]["exp"]
        cur_lvl = self.users[author_id]["level"]

        if cur_xp >= round((4 * (cur_lvl ** 3)) / 5):
            self.users[author_id]["level"] += 1
            return True
        else:
            return False

    @commands.Cog.listener()
    async def on_message(self, message):
        if message.author == self.client.user:
            return

        author_id = str(message.author.id)

        if not author_id in self.users:
            self.users[author_id] = {}
            self.users[author_id]["level"] = 0
            self.users[author_id]["exp"] = 0

        self.users[author_id]["exp"] += 1

        if self.lvl_up(author_id):
            await message.channel.send(f"{message.author.mention} is now level {self.users[author_id]['level']}")

    @commands.command(brief="Displays the user's level and experience.")
    async def level(self, ctx, member: discord.Member = None):
        member = ctx.author if not member else member
        member_id = str(member.id)

        if not member_id in self.users:
            await ctx.send(f"{member} doesn't have a level")
        else:
            embed = discord.Embed(color=member.color, timestamp=ctx.message.created_at)

            embed.set_author(name=f"Member = {member}", icon_url=self.client.user.avatar_url)

            embed.add_field(name="Level", value=self.users[member_id]["level"])
            embed.add_field(name="XP", value=self.users[member_id]["exp"])

            await ctx.send(embed=embed)


def setup(client):
    client.add_cog(Levels(client))

我需要的是稍微減慢 EXP 的增益,並使其停止向機器人和 webhooks 提供 EXP。

任何幫助,將不勝感激。 作為我發現構建它的指南並沒有很好地解釋 XP 中使用的變量如何實際測量它,所以我不確定要更改哪些數字。

我會說這是在了解公式的曲線是什么樣子和阻止用戶為 XP 發送垃圾郵件之間。 這個問題的答案中可以找到使用公式的很好的例子和它們的使用細目。

至於僅限於用戶在您的on_message函數中檢查if not user.bot:在您的調平代碼以排除 bots/webhooks 之前。

並限制xp增益記錄用戶上次發送消息的時間,然后從當前時間中減去該時間並確保它大於一分鍾或您認為合適的任何時間限制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM