Python DIscordbot с использованием MongoDB

#python #json #python-3.x #database #mongodb

Вопрос:

я попытался переключиться с json на MongoDB, и большинство вещей сработало. Однако команда bancomand не работает, потому что python не хранит идентификаторы пользователей в переменных дольше или не извлекает их из базы данных. Поэтому каждый раз, когда я запускаю команду, она выводит, что идентификатор находится не в переменной, а в идентификаторе, а имя хранится в базе данных. Надеюсь, кто — нибудь сможет мне в этом помочь. Вот мой полный код:

 import pymongo
import json
import discord
from discord.ext import commands

with open("mongosetup.json") as file:
    setupfile = json.load(file)

    # ==> DISCORDBOT SETUP <== #
    botprefix = setupfile.get("Discordbot Prefix")
    token = setupfile.get("Discordbot Token")

    # ==> DATABASE SETUP <== #
    url = setupfile.get("Database url")
    databasename = setupfile.get("Database Name")
    bot = commands.Bot(command_prefix=botprefix, case_insensitive=True, self_bot=False, Intents=discord.Intents.all())
    myclient = pymongo.MongoClient(url)
    mydb = myclient[databasename]
    print(myclient.list_database_names())
    dblist = myclient.list_database_names()

    if databasename in dblist:
        print("The database exists.")
    collection = mydb["UserData"]
    bannedusers = mydb["BannedUser"]



    @bot.command(name="AddDB")
    async def addtodb(ctx):

        try:
            userdata = {"_id": ctx.author.id, "Username": ctx.message.author.name}
            if ctx.author.id not in userdata:
                collection.insert_one(userdata)
                await ctx.send("Your Username and your UserID where stored into our Datebase sucessfully! n"
                               f"Saved Data: {userdata}")

        except pymongo.errors.DuplicateKeyError:
            await ctx.send("You cant add yourself twice in our Database. This User alredy exist!")

    @bot.command(name="ban")
    @commands.has_permissions(ban_members=True)
    async def banuser(ctx, member: discord.Member, *, reason=None):
        userdata = {"_id": member.id, "Username": member.display_name}
        data = collection.find_one({"_id": member.id})

        if data is None:
            post = {userdata}
            collection.insert_one(post)

        print(member.id)
        if member.id not in userdata:
            print("Not in userdata")
            bannedusers.insert_one(userdata)

        elif member.id in bannedusers:
            await ctx.send(f"Trying to ban the User {member.display_name}...")
            try:
                await member.ban(reason=reason)
                await ctx.send("Banned this user Sucessfully")
            except:
                await ctx.send("error")

    @bot.event
    async def on_command_error(ctx, error):
        if isinstance(error, commands.MissingRequiredArgument):
            await ctx.send("Please pass in all required Arguments :rolling_eyes:")
        if isinstance(error, commands.MissingPermissions):
            await ctx.send("You dont have all the required Permissions :angry:")


    @bot.event
    async def on_ready():
        print(f'{bot.user} has connected to Discord!')



bot.run(token)
 

Ответ №1:

Вы не можете искать переменную (member.id) внутри словаря. Также я не вижу причин для if member.id not in userdata: этого, потому что member.id всегда будет в данных пользователя, потому что вы указываете, что member.id должно быть внутри userdata.

Если я правильно понял, вы хотите запретить пользователям, а затем сохранить его в mongodb. Вы можете легко сделать это, сделав это вот так:

 @bot.command(name="ban")
@commands.has_permissions(ban_members=True)
async def banuser(ctx, member: discord.Member, *, reason=None):
    userdata = {"_id": member.id, "Username": member.display_name} #stores all values in a variable
    data = collection.find_one({"_id": member.id}) #looks for the user in the collection db

    if data is None: #if user doesnt exist in the user db
        collection.insert_one(userdata) #add the user
        
    await ctx.send(f"Trying to ban the User {member.display_name}...")
    try:
        await member.ban(reason=reason)
        await ctx.send("Banned this user Sucessfully")
        bannedusers.insert_one(userdata) #adds the user to the banned db
    except:
        await ctx.send("error")
 

Надеюсь, это поможет, и просто задавайте любые вопросы, если они у вас есть!