Discord Bot - Python 3 - передача пользовательских переменных другим функциям - PullRequest
0 голосов
/ 05 апреля 2020

Я делаю кубик для игры в кости. Discord bot qith Python 3. Число d ie ищет фразу в словаре и выводит ее. У меня было нормально работать с шестисторонним d ie, но я хочу, чтобы пользователь мог вместо этого сделать 10-сторонний d ie.

Чтобы бросить объявление ie, это так! y1 ', чтобы установить его на 10 сторон d ie это'! y d10 '. Я связал его с установкой d6 по умолчанию, однако, когда я пытаюсь перекатиться сейчас, это дает мне ошибку неопределенности переменной. Может ли кто-нибудь помочь мне указать, что мне не хватает?


import os
from random import randint

import discord
from dotenv import load_dotenv

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

client = discord.Client()

def ybna6_faces(x):
    return{
        1: 'Yes, And...',
        2: 'Yes...',
        3: 'Yes, But...',
        4: 'No, But...',
        5: 'No...',
        6: 'No, And...'
        }[x]

def danger6_faces(x):
        return{
                1: 'Blank',
                2: 'Blank',
                3: 'Blank',
                4: 'Blank',
                5: 'Skull!',
                6: 'Two Skull!!'
                }[x]

def ybna10_faces(x):
    return{
        1: 'Yes, And...',
        2: 'Yes...',
        3: 'Yes, But...',
        4: 'No, But...',
        5: 'No...',
        6: 'No, And...',
        7: '',
        8: '',
        9: '',
        10: ''
        }[x]

def danger10_faces(x):
        return{
                1: 'Blank',
                2: 'Blank',
                3: 'Blank',
                4: 'Blank',
                5: 'Skull!',
                6: 'Two Skull!!',
                7: '',
                8: '',
                9: '',
                10: ''
                }[x]


sides = 6
#active_ybna = 6
#active_danger = 6

w=""

#Successful server connection message
@client.event
async def on_ready():
        print(f'{client.user.name} has connected to Discord!')

#Makes sure bot doesn't respond to itself
@client.event
async def on_message(message):
        if message.author == client.user:
                return

#Choose die (6 or 10)
        if message.content.startswith('!y d6'):
            sides = 6

        if message.content.startswith('!y d10'):
            sides = 10

#Evaluate rolls
        if message.content.startswith('!y'):
                if int(message.content[2])>int(0):
                        z = int(message.content[2])
                        for x in range(z):   
                                y = randint(1,int(sides))
                                active_ybna = 'ybna'+ sides + '_faces()'
                                response = 'Roll ' + str(x+1) + ': ' + active_ybna(y)
                                await message.channel.send(response)
                if len(message.content)>=4:
                    if int(message.content[4])>int(0):
                        z = int(message.content[4])
                        for x in range(z):
                            y=randint(1,int(sides))
                            active_danger = 'danger'+ sides + '_faces()'
                            response = 'Danger ' + str(x+1) + ': ' + active_danger(y)
                            await message.channel.send(response)

client.run(TOKEN)

РЕДАКТИРОВАТЬ: обратная связь при вводе '! Y1'

YBNA Bot has connected to Discord!
Ignoring exception in on_message
Traceback (most recent call last):
  File "/home/pi/.local/lib/python3.7/site-packages/discord/client.py", line 312, in _run_event
    await coro(*args, **kwargs)
  File "/home/pi/Desktop/discord bots/ybnabot.py", line 92, in on_message
    y = randint(1,int(sides))
UnboundLocalError: local variable 'sides' referenced before assignment

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

У вас есть два оператора if, которые могут оба оценить False, то есть возможно, что переменная sides никогда не будет создана.

Это потому, что созданный вами sides находится вне функция, делая его вне области видимости. Вам нужно переместить это внутрь функции или объявить sides глобальным (не рекомендуется).

...

#active_ybna = 6
#active_danger = 6

w=""

#Successful server connection message
@client.event
async def on_ready():
    print(f'{client.user.name} has connected to Discord!')

#Makes sure bot doesn't respond to itself
@client.event
async def on_message(message):
    sides = 6
    if message.author == client.user:
        return

    #Choose die (6 or 10)
    if message.content.startswith('!y d6'):
        sides = 6

    if message.content.startswith('!y d10'):
        sides = 10

    #Evaluate rolls
    if message.content.startswith('!y'):
        if int(message.content[2])>int(0):
            z = int(message.content[2])
            for x in range(z):   
                 y = randint(1,int(sides))
                 active_ybna = 'ybna'+ sides + '_faces()'
                 response = 'Roll ' + str(x+1) + ': ' + active_ybna(y)
                 await message.channel.send(response)
         if len(message.content)>=4:
             if int(message.content[4])>int(0):
                 z = int(message.content[4])
                 for x in range(z):
                     y=randint(1,int(sides))
                     active_danger = 'danger'+ sides + '_faces()'
                     response = 'Danger ' + str(x+1) + ': ' + active_danger(y)
                     await message.channel.send(response)

client.run(TOKEN)
0 голосов
/ 06 апреля 2020

Я думаю, что мои выданные переменные не объявлены глобальными. Я как бы упростил все это и спрятал в одно событие с несколькими IF.

Также добавлен другой код ...

# ybnabot.py
#d6 functionality

import os
from random import randint

import discord
from dotenv import load_dotenv

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

client = discord.Client()

def ybna6_faces(x):
    return{
        1: 'No, And...',
        2: 'No...',
        3: 'No, But...',
        4: 'Yes, But...',
        5: 'Yes...',
        6: 'Yes, And...'
        }[x]

def danger6_faces(x):
        return{
        1: 'Blank',
        2: 'Blank',
        3: 'Blank',
        4: 'Blank',
        5: ':skull:',
        6: ':skull: :skull:'
        }[x]

def ybna10_faces(x):
    return{
        1: 'No, And...',
        2: 'No, And, But...',
        3: 'No...',
        4: 'Not, But...',
        5: 'No, But, And...',
        6: 'Yes, But, And...',
        7: 'Yes, But...',
        8: 'Yes...',
        9: 'Yes, And, But...',
        10: 'Yes, And...'
        }[x]

def danger10_faces(x):
        return{
                1: 'Blank',
                2: 'Blank',
                3: 'Blank',
                4: 'Blank',
                5: ':skull',
                6: ':skull: :skull',
                7: 'Blank',
                8: 'Blank',
                9: ':skull:',
                10: ':skull: :skull:'
                }[x]

@client.event
async def on_ready():
    global sides
    sides = 6
    print(f'{client.user.name} has connected to Discord!')


@client.event
async def on_message(message):
    global sides
    if message.author == client.user:
        return

#Send Help DM
    if message.content.startswith('!y help'):
        await message.author.send('YBNA Bot Help!')
        await message.author.send('Commands:')
        await message.author.send('!y X Z - Roll X number of YBNA dice and Z Danger dice (Danger die can be omitted)')
        await message.author.send('!y d6 - Choose six sided dice')
        await message.author.send('!y d10 - Choose 10 sided dice')
        await message.author.send('!y dice - Displays which dice are selected (d6 or d10)')
        await message.author.send('!y help - This message!')
        await message.author.send('txutfz73 credits here')
        await message.author.send('github link here')
        return


#Check die used
    if message.content.startswith('!y dice'):
        response = 'Using ' + str(sides) + ' sided dice!'
        await message.channel.send(response)
        return

#Choose d6 or d10
    if message.content.startswith('!y d6'):
        sides = 6
        await message.channel.send('Now using d6!')
        return

    if message.content.startswith('!y d10'):
        sides = 10
        response = 'Now using d10!'
        await message.channel.send(response)
        return




#Roll d6
    if sides == 6:
        if message.content.startswith('!y'):
            if int(message.content[2])>int(0):
                z = int(message.content[2])
                for x in range(z):
                    y = randint(1,6)
                    response = 'Roll ' + str(x+1) + ': ' + ybna6_faces(y) + str(sides)
                    await message.channel.send(response)

        if len(message.content)>=4:
            if int(message.content[4])>int(0):
                z = int(message.content[4])
                for x in range(z):
                    y=randint(1,6)
                    response = 'Danger ' + str(x+1) + ': ' + danger6_faces(y)
                    await message.channel.send(response)

#Roll d10
    else:
        if message.content.startswith('!y'):
            if int(message.content[2])>int(0):
                z = int(message.content[2])
                for x in range(z):
                    y = randint(1,10)
                    response = 'Roll ' + str(x+1) + ': ' + ybna10_faces(y) + str(sides)
                    await message.channel.send(response)

        if len(message.content)>=4:
            if int(message.content[4])>int(0):
                z = int(message.content[4])
                for x in range(z):
                    y=randint(1,10)
                    response = 'Danger ' + str(x+1) + ': ' + danger10_faces(y)
                    await message.channel.send(response)


client.run(TOKEN)
...