[英]Custom prefix command with MongoDB
I am trying to create a setprefix
command, which changes the server prefix.我正在尝试创建一个
setprefix
命令,它会更改服务器前缀。 However, I am getting the following error:但是,我收到以下错误:
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
My code:我的代码:
Main.py
主文件
#------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)
Prefixes cog file
前缀 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))
I do not understand why there is a TypeError
.我不明白为什么会有
TypeError
。 I am using motor
as it supports async.我正在使用
motor
因为它支持异步。 In motor documentation
it says that when using find_one()
It give as a dictionary.在
motor documentation
它说当使用find_one()
它作为字典给出。 Which is why I did this as you can see in the code above:这就是为什么我这样做的原因,正如您在上面的代码中看到的那样:
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)
I did that to get the first value of the key Prefix
.我这样做是为了获得键
Prefix
的第一个值。 If there is another to do this, please tell me.如果有其他人这样做,请告诉我。
我认为您将需要一个数据库来制作自定义前缀代码,因为您需要为机器人所在的每个服务器设置一个自定义前缀。
This is simple if you understand the logic , firstly code though如果您理解逻辑,这很简单,但首先要编写代码
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))
What it does and how it works?它有什么作用以及它是如何工作的?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.