#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")
Надеюсь, это поможет, и просто задавайте любые вопросы, если они у вас есть!