#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 конкретный вопрос