Python - Discord.py - Запретить многократное использование одного и того же кода в функции on_message - PullRequest
0 голосов
/ 14 июля 2020

Я создал простого бота с помощью Discord.py, который выводит содержимое текстовых файлов, содержащих очищенные спортивные приспособления и данные каналов (очищенные данные получены из других небольших скриптов, которые я создал, но не включил сюда).

discordbot.py

import discord
import os
from dotenv import load_dotenv


client = discord.Client()

load_dotenv()
TOKEN = os.getenv('DISCORD_TOKEN')
GUILD = os.getenv('DISCORD_GUILD')

client = discord.Client()

@client.event
async def on_ready():
    for guild in client.guilds:
        if guild.name == GUILD:
            break

    print(
        f'{client.user} is connected to the following guild:\n'
        f'{guild.name}(id: {guild.id})'
    )

                
@client.event
async def on_message(message):
    id = client.get_guild(73194****229982)
    

    if str(message.channel) == "boxingmma":
        if message.content.find("!boxing") != -1:

            with open('/home/brendan/Desktop/boxingtest.txt', 'r') as file:
                msg = file.read(2000).strip()
                while len(msg) > 0:
                    await message.author.send(msg)
                    msg = file.read(2000).strip()
                    
    if str(message.channel) == "football":
        if message.content.find("!english") != -1:

            with open('/home/brendan/Desktop/splittest.txt', 'r') as file:
                msg = file.read(2000).strip()
                while len(msg) > 0:
                    await message.author.send(msg)
                    msg = file.read(2000).strip()
                    
    if str(message.channel) == "football":
        if message.content.find("!scottish") != -1:

            with open('/home/brendan/Desktop/testing2.txt', 'r') as file:
                msg = file.read(2000).strip()
                while len(msg) > 0:
                    await message.author.send(msg)
                    msg = file.read(2000).strip()
            


client.run("NzMxOTQ4Mzk5NzY2NjY3NDg2.XwuPsw.iN****-e2yDnRS_uWqff43Thvqw")

Бот работает нормально, и когда команды выполняются на соответствующем канале Discord, DM отправляется пользователю, отправившему запрос боту. Самая большая проблема, с которой я столкнулся с этим кодом, - это повторяющийся код в функции on_message. Единственное различие между тремя разными операторами double if - это имя канала, например Football или Boxing, команда, например! Scotti sh,! Engli sh,! Boxing и путь к файлу для извлеченных данных.

Мне любопытно, знает ли кто-нибудь, как это можно улучшить или способ повторного использования повторяющегося кода? Я попытался передать их как позиционные аргументы из другой функции, например:

def callall():
    on_message(channel="football", command="!english", filepath="/home/brendan/Desktop/test.txt")

, но оказалось, что после исследования этого невозможно передать аргументы on_message в discord.py

Мы будем очень благодарны за любые предложения о том, как можно возобновить повторяющийся код или как можно улучшить общий поток программы.

Всем спасибо.

1 Ответ

1 голос
/ 14 июля 2020

вы можете использовать dict как

dict = {"boxingmma":"/home/brendan/Desktop/boxingtest.txt", "football":"/home/brendan/Desktop/splittest.txt", "football1":"/home/brendan/Desktop/testing2.txt"}

for key, value in dict:
    if str(message.channel) == key:
        if message.content.find("!boxing") != -1:

            with open(value, 'r') as file:
                msg = file.read(2000).strip()
                while len(msg) > 0:
                    await message.author.send(msg)
                    msg = file.read(2000).strip()

для третьего значения. Я поставил football как football1, потому что клавиши не могут повторяться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...