python - 使用 MongoDB 的自定义前缀命令
问题描述
我正在尝试创建一个setprefix
更改服务器前缀的命令。但是,我收到以下错误:
raise TypeError("command_prefix must be plain string, iterable of strings, or callable "
TypeError: command_prefix must be plain string, iterable of strings, or callable returning either of these, not coroutine
我的代码:
主文件
#------importing packages
import keep_alive
import os
import discord
from discord.ext import commands
import pymongo
from pymongo import MongoClient
import asyncio
import motor
import motor.motor_asyncio
import prefixes
from prefixes import Prefixes
### MongoDB Variables ###
mongo_url = os.environ['Mongodb_url']
cluster = motor.motor_asyncio.AsyncIOMotorClient(str(mongo_url))
db = cluster['Database']
collection = db['prefixes']
bot = commands.Bot(command_prefix = Prefixes.setprefix(), case_insensitive=True)
bot.remove_command('help')
my_token = os.environ['Token']
#------When bot is online
@bot.event
async def on_ready():
#status
#playing game status
await bot.change_presence(activity=discord.Game(
name=f'On {len(bot.guilds)} Servers | -help'))
print('Bot is Ready')
initial_extensions = ['help', 'math1', 'mod', 'anime', 'prefixes']
if __name__ == '__main__':
for extension in initial_extensions:
bot.load_extension(extension)
#ping latency....
@bot.command()
async def ping(ctx):
await ctx.send(f'Pong\n{round(bot.latency * 1000)}ms')
#------Running the bot
keep_alive.keep_alive()
bot.run(my_token)
前缀 cog 文件
import discord
from discord.ext import commands
import asyncio
import motor
import motor.motor_asyncio
import os
class Prefixes(commands.Cog):
def __init__(self, bot):
self.bot = bot
#custom prefix
@commands.command()
@commands.has_permissions(administrator = True)
async def setprefix(self, ctx, prefix):
### MongoDB Variables ###
mongo_url = os.environ['Mongodb_url']
cluster = motor.motor_asyncio.AsyncIOMotorClient(str(mongo_url))
db = cluster['Database']
collection = db['prefixes']
guild_id = ctx.guild.id
server_prefix = prefix
if (await collection.count_documents({})) == 0:
prefix_info = {'GuildId': guild_id, 'Prefix': server_prefix}
await collection.insert_one(prefix_info)
else:
prefix_info = {'GuildId': guild_id, 'Prefix': server_prefix}
await collection.update_one({'GuildId': guild_id}, {'$set': {'Prefix': prefix}})
await ctx.send(f'My prefix is now {prefix}')
finding_prefix = await collection.find_one({'Prefix': {'$eq': prefix}})
view_finding_prefix = finding_prefix.values()
iterate_view = iter(view_finding_prefix)
first_value = next(iterate_view)
self.bot(command_prefix = str(first_value), case_insesitive = True)
def setup(bot):
bot.add_cog(Prefixes(bot))
我不明白为什么会有一个TypeError
. 我正在使用motor
它,因为它支持异步。motor documentation
它说,当使用它作为find_one()
字典时。这就是我这样做的原因,正如您在上面的代码中看到的那样:
finding_prefix = await collection.find_one({'Prefix': {'$eq': prefix}})
view_finding_prefix = finding_prefix.values()
iterate_view = iter(view_finding_prefix)
first_value = next(iterate_view)
self.bot(command_prefix = str(first_value), case_insesitive = True)
我这样做是为了获得 key 的第一个值Prefix
。如果有其他人这样做,请告诉我。
解决方案
如果您了解逻辑,这很简单,但首先要编写代码
import os
import discord
import motor.motor_asyncio
import nest_asyncio
from discord.ext import commands
from discord.ext.commands import BucketType, cooldown
from pymongo import MongoClient
nest_asyncio.apply()
mongo_url = os.environ.get("MONGO_URL")
cluster = motor.motor_asyncio.AsyncIOMotorClient(mongo_url)
predb = cluster["discord"]["prefix"]
class Prefix(commands.Cog):
def __init__(self, client):
self.client = client
@commands.Cog.listener()
async def on_ready(self):
print("Prefix cog loaded successfully")
@commands.command(
cooldown_after_parsing=True, description="Changes Bot prefix for this server"
)
@cooldown(1, 10, BucketType.user)
@commands.has_permissions(administrator=True)
async def setprefix(self, ctx, new_prefix):
if len(new_prefix) > 3:
embed = discord.Embed(
timestamp=ctx.message.created_at,
title="Error",
description="Looks like the prefix is very big ",
color=0xFF0000,
)
await ctx.send(embed=embed)
else:
new_prefix = str(new_prefix)
stats = await predb.find_one({"guild": ctx.guild.id})
if stats is None:
updated = {"guild": ctx.guild.id, "prefix": new_prefix}
await predb.insert_one(updated)
embed = discord.Embed(
title="Prefix",
description=f"This server prefix is now {new_prefix}",
color=0xFF0000,
)
await ctx.send(embed=embed)
else:
await predb.update_one(
{"guild": ctx.guild.id}, {"$set": {"prefix": new_prefix}}
)
embed = discord.Embed(
timestamp=ctx.message.created_at,
title="Prefix",
description=f"This server prefix is now {new_prefix}",
color=0xFF0000,
)
await ctx.send(embed=embed)
def setup(client):
client.add_cog(Prefix(client))
它的作用和工作原理是什么?
- 它首先检查前缀是否太长,因为没有人希望人们弄乱并忘记长前缀发生的前缀,如果服务器已经注册,即如果前缀是在它更新之前更改,否则创建一个新条目,希望这会有所帮助,如果它对您有用并且您很高兴,请将此标记为答案:)