Я хочу обновить словарь / json ключ вместо добавления нового? - PullRequest
0 голосов
/ 20 января 2020

Хорошо, поэтому я использую discord.py и JSON, и я пытаюсь создать счетчик билетов, клиент отказывается использовать базу данных, поэтому я должен использовать JSON. Но каждый раз, когда код обновляет файл, он создает второй ключ, а затем использует этот ключ вместо первого. Если кто-то захочет увидеть это в действии, дружите со мной (Jpac14 # 8237), и я покажу вам, что происходит. Я также приложу свой код и файл JSON.

Также, как вы думаете, я мог бы использовать для этого модуль коллекций.

Код:

from discord.ext import commands
import discord
import json

class TicketSystem(commands.Cog):
    def __init__(self, bot):
        self.bot = bot
        self.create_ticket_msgs = []

    @commands.Cog.listener()
    async def on_reaction_add(self, reaction, user):
        for create_ticket_msg in self.create_ticket_msgs:
            if reaction.message.id == create_ticket_msg.id and user != self.bot.user:
                await reaction.message.channel.send(f"{user} reacted")
                await reaction.message.remove_reaction("?", user)

                ticket_counter_dict = {}

                try:
                    with open("json/ticket_counter.json", "r") as ticket_counter_json:
                        ticket_counter_dict = json.load(ticket_counter_json)
                except json.JSONDecodeError:
                    print("JSONDecodeError")

                current_ticket_counter = ticket_counter_dict.get(str(reaction.message.guild.id))

                if current_ticket_counter == None:
                    current_ticket_counter = 1

                ticket_catergory = discord.utils.get(reaction.message.guild.categories, name="Tickets")

                if reaction.message.guild.id == 660156957486874645:
                    support_team_role = discord.utils.get(reaction.message.guild.roles, name="Staff")
                else:
                    support_team_role = discord.utils.get(reaction.message.guild.roles, name="Support")

                ticket_channel_overwrites = {
                    support_team_role: discord.PermissionOverwrite(read_messages=True),
                    user: discord.PermissionOverwrite(read_messages=True),
                    reaction.message.guild.default_role: discord.PermissionOverwrite(read_messages=False)
                }

                users_ticket_channel = await ticket_catergory.create_text_channel(f"ticket-{current_ticket_counter}", overwrites=ticket_channel_overwrites)

                current_ticket_counter += 1

                ticket_counter_dict.update({reaction.message.guild.id: current_ticket_counter})

                with open("json/ticket_counter.json", "w") as ticket_counter_json:
                    json.dump(ticket_counter_dict, ticket_counter_json)

                embedMessage = discord.Embed(description="Support will be with you shortly.\nTo close the ticket type ?close", color=discord.colour.Colour.green())
                embedMessage.set_footer(text=f"Created By Nexus Developments - https://discord.gg/YmdugDf", icon_url="https://i.imgur.com/MRBsIpe.png")

                await users_ticket_channel.send(embed=embedMessage)



    @commands.command(name="ticketmsg")
    async def send_create_ticket_msg(self, ctx, channel: discord.TextChannel):
        embedMessage = discord.Embed(title="Create A Ticket", description="To create a ticket react with ?", timestamp=ctx.message.created_at, color=discord.colour.Colour.green())
        embedMessage.set_footer(text=f"Created By Nexus Developments - https://discord.gg/YmdugDf", icon_url="https://i.imgur.com/MRBsIpe.png")

        create_ticket_msg = await channel.send(embed=embedMessage)
        await create_ticket_msg.add_reaction("?")

        self.create_ticket_msgs.append(create_ticket_msg)


def setup(bot):
    bot.add_cog(TicketSystem(bot))

JSON Файл:

{"665930890039394305": 6, "665930890039394305": 7}

1 Ответ

1 голос
/ 20 января 2020

reaction.message.guild.id - это int.

Когда вы пишете ticket_counter_dict.update({reaction.message.guild.id: current_ticket_counter}), вы создаете новый ключ int в вашем диктовке, который не перекрывает ключ str, существующий из загрузка файла json.

См. этот пример:

import json
d = {1: 'a', '1': 'b'}
json.dumps(d)
>>> '{"1": "b", "1": "a"}'

Диктовка может содержать как 1, так и '1' как ключи, поскольку они являются различными объектами. Но сериализация json превратит обе строки в строки, так как json использует строки в качестве ключей.

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

Вы можете исправить свой код, убедившись, что вы используете строку для ключа в вашем dict:

ticket_counter_dict.update({str(reaction.message.guild.id): current_ticket_counter})
...