Как мне разрешить системе выравнивания добавлять роли на определенных уровнях? - PullRequest
0 голосов
/ 10 апреля 2020

Я создал систему выравнивания для своего бота и хочу, чтобы она добавляла роль всякий раз, когда вы достигаете определенного уровня. Я также хочу, чтобы роли и уровень, на котором они применяются, были установлены командой. Вот мой код

import itertools
import json
import random
import time
import traceback
import datetime
from functools import partial

import discord
from async_timeout import timeout
from discord.ext import commands
from discord.utils import get
from random import randint

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

        self.bot.loop.create_task(self.save_users())

        with open('users.json', 'r') as f:
            self.users = json.load(f)

    async def save_users(self):
        await self.bot.wait_until_ready()
        while not self.bot.is_closed():
            with open('users.json', 'w') as f:
                json.dump(self.users, f, indent=4)

            await asyncio.sleep(5)

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

        if cur_xp >= round(2 * ((0.0002 * (cur_lvl ** 4)) - (0.0801 * (cur_lvl ** 3)) + (11.221 * (cur_lvl ** 2)) + (64.6 * cur_lvl) + 130.09)):
            self.users[guild_id][author_id]['level'] += 1
            return True
        else:
            return False

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

        if message.content.startswith('s.') is not True:
            if message.guild != None:
                f = open("users.json")
                self.users = json.load(f)
                if str(f"{message.guild.id}") not in self.users:
                    self.users[f"{message.guild.id}"] = {}
                    print(f"Guild file has been created for {message.guild.id}/{message.guild.name}")

                author_id = str(message.author.id)
                guild_id = str(message.guild.id)

                if str(f"{message.author.id}") not in self.users[f"{message.guild.id}"]:    
                    self.users[f"{message.guild.id}"][f"{message.author.id}"] = {}
                    self.users[guild_id][author_id]['level'] = 0
                    self.users[guild_id][author_id]['exp'] = 0
                    self.users[guild_id][author_id]["last_message"] = 0

                if time.time() - self.users[guild_id][author_id]["last_message"] > 5:
                    self.users[guild_id][author_id]['exp'] += random.randint(3,7)
                    self.users[guild_id][author_id]["last_message"] = time.time()

            if self.lvl_up(author_id, guild_id):
                await message.channel.send(f"""{message.author.mention} has leveled up to level {self.users[guild_id][author_id]['level']}!""")

    @commands.command()
    async def rank(self, ctx, member: discord.Member = None):
        member = ctx.author if not member else member
        member_id = str(member.id)
        guild_id = str(ctx.guild.id)

        if not member_id in self.users[guild_id]:
            await ctx.send(f"That user has no experience")
        else:
            embed = discord.Embed(color=member.color, timestamp=ctx.message.created_at)
            embed.set_author(name=f"Rank - {member}", icon_url=self.bot.user.avatar_url)
            embed.add_field(name="Level", value=self.users[guild_id][member_id]['level'])
            embed.add_field(name="Experience", value=self.users[guild_id][member_id]['exp'])

            await ctx.send(embed=embed)  

def setup(bot):
    bot.add_cog(Levels(bot))
    print('Levels Loaded')

Я довольно новичок в этом, и я попытался создать файл. json для хранения установленных ролей и уровней для каждого сервера, но он не работал. Я также огляделся и, кажется, не могу найти что-либо, связанное с тем, что я делаю, поэтому любая помощь будет очень признательна.

1 Ответ

0 голосов
/ 11 апреля 2020

Я не проверял это, но вы ищете что-то, что будет выглядеть так:

# You can save this as a class variable
roles = {1: "Noobie", 10: "Experienced", 30: "master"}

# Add this to the function that checks if the user has leveled up
for level, role in roles.items():
    if user_level == level:
        await user.add_roles(role, reason=None, atomic=True)
        # Adds the desired role

Я не уверен, что это лучший способ сделать это, но вы, конечно, можете попробовать.

...