У меня есть команда в боте, которая позволит людям с указанными c ролями вознаграждать других пользователей валютой. Я пытаюсь настроить его так, чтобы при использовании команды бот отправлял DM пользователю, уведомляя его о вознаграждении, а затем отправлял DM мне (владельцу бота), чтобы сообщить мне о действии. и почему это было дано.
У меня есть файл настройки, в котором есть словарь, который связывает имя пользователя с userID. Поэтому, когда вы набираете, например: !rewardgold 100 Joe'
, он принимает 'joe' и просматривает его в базе данных, чтобы увидеть, связан ли с ним идентификатор. В связи с этим у меня уже есть уникальный идентификатор пользователя Джо, и у меня, очевидно, есть свой собственный. Так что это просто вопрос отправки этой DM каждому человеку. В настоящее время я использую ctx.send()
в приведенном ниже коде для завершения, но желательно заменить его на DM для обоих людей.
Также @commands.has_role("Admin")
закомментировано, потому что, несмотря на имя пользователя, которое я тестирую это при наличии роли «Admin» с помощью команды всегда выдает ошибку. Это в сценарии: BotCommands.py
import os
import json
import asyncio
from pathlib import Path
from collections import Counter
from discord.ext import commands
from gamelogic import onMSGAccept, onMSGRoll, onMSGUtil, onPRIUtil
class Combat(commands.Cog):
def __init__(self, client):
self.client = client
#!rewardgold <gold> <player> <reason> (If no reason given, defaults to "Not Specified")
@commands.command()
@commands.dm_only()
#@commands.has_role("Admin")
async def rewardgold(self, ctx, gold, player, reason="Not Specified"):
msg = ""
charFolder = characters()
with open(charFolder + "playerDatabase.txt", 'r', encoding="utf-8") as file2:
playerDatabase = json.loads(file2.read())
file2.close()
try:
gifted = ""
for item in playerDatabase.items():
if item[0].lower() == player.lower():
gifted = item[1]
giftedFile = open(charFolder + str(gifted) + ".txt", "r", encoding="utf-8")
giftedData = json.load(giftedFile)
giftedFile.close()
giftedData['gold'] += int(gold)
file = open(charFolder + str(gifted) + ".txt", "w", encoding="utf-8")
json.dump(giftedData, file, ensure_ascii=False, indent=2)
file.close()
await ctx.send(player + " has been awarded " + str(gold) +
" gold. (Reason: " + reason)
except FileNotFoundError:
await ctx.send(player + " does not have a character.")
Я пытался сделать свою домашнюю работу, но все, что я гуглял, вращается вокруг использования Client.send_message
, которое было прекращено в перезаписи discord.py в пользу просто отправить (). Я не уверен, как использовать .send()
для отправки сообщения уникальному идентификатору Джо, а не обратно тому, кто первым использовал команду.
Я также искал событие, которое содержит on_message
, но опять же, мой гугл-фу показывает только примеры очень простой работы c в каналах. Приведенные примеры - это всегда слушать комнату, видеть напечатанное сообщение и снова выплевывать его обратно в комнату. Это не полезно Мой скрипт инициации бота botCreation.py
выглядит следующим образом:
import discord
import os
import json
from discord.ext import commands
with open('token.txt', 'r+') as file:
stuff = json.load(file)
file.close()
token = stuff["token"]
client = commands.Bot(command_prefix = '!')
client.remove_command('help')
@client.command()
async def load(ctx, extension):
client.load_extension("cogs." + extension)
@client.command()
async def unload(ctx, extension):
client.unload_extension("cogs." + extension)
@client.command()
async def reload(ctx, extension):
client.unload_extension("cogs." + extension)
client.load_extension("cogs." + extension)
for filename in os.listdir("./cogs"):
if filename.endswith('.py'):
client.load_extension("cogs." + filename[:-3])
client.run(token)
Буду признателен за любую помощь.