У меня возникли проблемы с использованием бота discord, который перечисляет игроков на сервере CS 1.6

#discord.py

Вопрос:

Прежде всего, будьте осторожны, это мой первый раз, когда я использую python и discord.py так как все, чему я учился в школе, — это C HTML и PHP

Я пытаюсь использовать бота discord, который показывает подробную информацию о сервере GoldenSrc (точнее, сервере CS 1.6), который я получил с github.

Я установил Python, PIP, discord.py и запустил бота с помощью powershell и следующей команды, как указано создателем : python main.py У бота есть следующая команда для установки IP-адреса сервера : $setup ip:port

Вот что я получаю :

 Logged in as: [REDACTED]#****
(Input : $setup [ip]:[port] on discord server chat)
Ignoring exception in command setup:
Traceback (most recent call last):
  File "D:PythonPython39libsite-packagesdiscordextcommandscore.py", line 85, in wrapped
    ret = await coro(*args, **kwargs)
  File "D:Discord botcogscommands.py", line 44, in setup
    await Database(self).replace_db(guild_id)
  File "D:Discord botcogsdatabase.py", line 31, in replace_db
    if row[0] != str(guild_id):
IndexError: list index out of range
 

Это код, присутствующий в main.py

 import discord, os
from discord.ext import commands
from discord.ext.commands import bot

owner_id = REDACTED

client = commands.Bot(command_prefix='

commands.py :

 # import discord
from discord.ext import commands
from discord.ext.commands import bot
from cogs.query import *
from cogs.database import *
from main import has_perms

class Commands(commands.Cog):

    def __init__(self, client):
        self.client = client

    @commands.command()
    async def help(self, ctx):
        author = self.client.get_user(ctx.message.author.id)

        embed = discord.Embed(colour=discord.Color.blue())
        embed.set_author(name='Commands:')
        embed.add_field(name='$help', value='Displays this message.', inline=False)
        embed.add_field(name='$setup IP:Port', value='Used to setup a source server.', inline=False)
        embed.add_field(name='$server', value='Displays current server information.', inline=False)

        embed2 = discord.Embed(colour=discord.Color.blue())
        embed2.add_field(name='To setup your server please use this format: $setup IP:Port', value='$setup 127.0.0.1:27015', inline=False)
        embed2.set_footer(text='Source Server Manager | Created by Hamzah#0017')

        await author.send(embed=embed)
        await author.send(embed=embed2)

        await ctx.send('Please check your DMs for a list of commands.')

    @commands.command()
    async def setup(self, ctx, address):
        if not has_perms(ctx):
            await ctx.send('> You must be an admin to use this command.')
            return

        if "." not in address or ":" not in address:
            await ctx.send('> The IP/Port was formatted incorrectly, e.g. 127.0.0.1:27015')
            return

        guild_id = ctx.message.author.guild.id

        await Database(self).replace_db(guild_id)
        await Database(self).write_db(guild_id, address)

        await ctx.send('Your server has been added to the database, use the $server command to view server information.')

    @commands.command()
    async def server(self, ctx):
        check = str(ctx.message.channel.type)
        if check == 'private':
            return False

        address = (await Database(self).read_db())[0][1]
        server_info = await Query(self).get_server_info(address)

        server_embed = discord.Embed(colour=discord.Color.blue())
        server_embed.set_thumbnail(url='https://cdn.icon-icons.com/icons2/1852/PNG/512/iconfinder-server-4417119_116634.png')
        server_embed.set_author(name=server_info[2])
        server_embed.add_field(name='IP Address:', value=address)
        server_embed.add_field(name='Players:', value=str(server_info[0])   '/'   str(server_info[1]), inline=False)
        server_embed.add_field(name='Map:', value=server_info[3], inline=False)
        server_embed.set_footer(text='Source Server Manager | Created by Hamzah#0017')

        await ctx.send(embed=server_embed)

        if server_info[0] == 0:
            return

        try:
            player_info = await Query(self).get_players(address)

            player_embed = discord.Embed(colour=discord.Color.blue())
            player_embed.set_author(name='Online Players:')

            for i in range(0, server_info[0]):
                player_embed.add_field(name=player_info[0][i], value=str(player_info[1][i])   ' minutes')
            
            await ctx.send(embed=player_embed)

        except:
            await ctx.send('> I was unable to print the player list, this could be due to weird characters in names.')


def setup(client):
    client.add_cog(Commands(client))
 

database.py

   
import discord, csv
from discord.ext import commands
from discord.ext.commands import bot

class Database(commands.Cog):

    def __init__(self, client):
        self.client = client

    async def read_db(self):
        lines = list()

        with open('database.csv', 'r') as file:
            reader = csv.reader(file)
            for row in reader:
                lines.append(row)

        return lines

    async def write_db(self, guild_id, address):
        with open('database.csv', 'a', newline='') as file:
            writer = csv.writer(file)
            writer.writerow([guild_id, address])

    async def replace_db(self, guild_id):
        lines = list()

        with open('database.csv', 'r') as inp:
            for row in csv.reader(inp):
                if row[0] != str(guild_id):
                    lines.append(row)

        with open('database.csv', 'w', newline='') as file:
            writer = csv.writer(file)
            for x in range(0, len(lines)):
                writer.writerow([lines[x][0]])

def setup(client):
    client.add_cog(Database(client))
 

query.py

 import discord, valve.source.a2s
from discord.ext import commands
from discord.ext.commands import bot

class Query(commands.Cog):

    def __init__(self, client):
        self.client = client

    async def get_server_info(self, address):
        address = address.split(':')[0], int(address.split(':')[1])
        info = list()

        with valve.source.a2s.ServerQuerier(address) as server:
            info.append(server.info()['player_count'])
            info.append(server.info()['max_players'])
            info.append(server.info()['server_name'])
            info.append(server.info()['map'])
            info.append(server.info()['game'])

        return info

    async def get_players(self, address):
        address = address.split(':')[0], int(address.split(':')[1])
        player_list, time_online = [], []

        with valve.source.a2s.ServerQuerier(address) as query:
            for player in query.players()['players']:
                player_list.append("{name}".format(**player))
                time_online.append(round(float("{duration}".format(**player)) / 60))

        return player_list, time_online

def setup(client):
    client.add_cog(Query(client))
 

Комментарии:

1. Добро пожаловать в Stack Overflow. Не могли бы вы, пожалуйста, опубликовать соответствующий код? В сообщении об ошибке отображается другая команда, которой здесь нет.

2. я добавил все файлы .py из папки

3. в D:PythonPython39libsite-packagesdiscordextcommandscore.py происходит от discord.py

4. @Rosco D:Discord botcogscommands.py и D:Discord botcogsdatabase.py исходят из вашего собственного кода, который является основной причиной. в discord.py ядро просто есть, потому что discord.py вызывает вашу функцию, когда кто-то использует эту команду

5. row скорее всего, пусто, idk, какова ваша библиотека csv, но я думаю, что она не отфильтровывает пустые строки? или что-то не так с библиотекой, на самом деле это не так discord.py конкретный вопрос

)
client.remove_command('help')

@client.event
async def on_ready():
print('Logged in as: {0.user}'.format(client))

@client.command()
@commands.is_owner()
async def load(ctx, extension):
client.load_extension(f'cogs.{extension}')
await ctx.send(f'> Loaded {extension}.')

@client.command()
@commands.is_owner()
async def unload(ctx, extension):
client.unload_extension(f'cogs.{extension}')
await ctx.send(f'> Unloaded {extension}.')

@client.command()
@commands.is_owner()
async def reload(ctx, extension):
client.reload_extension(f'cogs.{extension}')
await ctx.send(f'> Reloaded {extension}.')

def load_cogs():
for filename in os.listdir('./cogs'):
if filename.endswith('.py'):
client.load_extension(f'cogs.{filename[:-3]}')

def has_perms(ctx):
if ctx.message.author.guild_permissions.administrator or ctx.message.author.id == owner_id:
return True

return False

load_cogs()

client.run('REDACTED')
commands.py :


database.py


query.py


Комментарии:

1. Добро пожаловать в Stack Overflow. Не могли бы вы, пожалуйста, опубликовать соответствующий код? В сообщении об ошибке отображается другая команда, которой здесь нет.

2. я добавил все файлы .py из папки

3. в D:PythonPython39libsite-packagesdiscordextcommandscore.py происходит от discord.py

4. @Rosco D:Discord botcogscommands.py и D:Discord botcogsdatabase.py исходят из вашего собственного кода, который является основной причиной. в discord.py ядро просто есть, потому что discord.py вызывает вашу функцию, когда кто-то использует эту команду

5. row скорее всего, пусто, idk, какова ваша библиотека csv, но я думаю, что она не отфильтровывает пустые строки? или что-то не так с библиотекой, на самом деле это не так discord.py конкретный вопрос