PMing нескольких пользователей, когда команда используется - PullRequest
0 голосов
/ 20 января 2020

У меня есть команда в боте, которая позволит людям с указанными 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)

Буду признателен за любую помощь.

...