my current code for sending messages, in one version of the bot it worked, but when I transferred it to this code it stopped working
import discord
from discord.ext import tasks
from utils.logger import get_logger
from discord_bot.database import get_db_connection, save_properties_to_db
from discord_bot.properties import fetch_properties, parse_houses, parse_businesses
import json
logger = get_logger()
# Загрузка конфигурации
with open('config.json') as config_file:
config = json.load(config_file)
DISCORD_TOKEN = config['discord_token']
CHANNEL_ID = config['channel_id']
DB_CONFIG = config['db_config']
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)
sent_houses = {}
sent_businesses = {}
@client.event
async def on_ready():
logger.info(f'We have logged in as {client.user}')
fetch_and_save_properties.start()
@client.event
async def on_disconnect():
logger.warning('Bot has been disconnected')
@client.event
async def on_resumed():
logger.info('Bot has resumed')
@tasks.loop(minutes=1)
async def fetch_and_save_properties():
logger.info('Starting property fetch and save task')
connection = get_db_connection(DB_CONFIG)
if not connection:
logger.error('Failed to get database connection')
return
cursor = connection.cursor()
page_content = await fetch_properties()
if not page_content:
logger.error('Failed to fetch properties')
return
houses = parse_houses(page_content)
businesses = parse_businesses(page_content)
logger.info("Fetched houses: %s", houses)
logger.info("Fetched businesses: %s", [(num, own, typ, nam, str(prc)) for num, own, typ, nam, prc in businesses])
if save_properties_to_db(cursor, houses, businesses):
connection.commit()
logger.info('Data successfully saved to database')
await check_properties(cursor)
else:
connection.rollback()
logger.error('Failed to save data to database')
cursor.close()
connection.close()
async def check_properties(cursor):
global sent_houses, sent_businesses
cursor.execute("SELECT number, owner, class, garage_spaces, price FROM houses")
houses = cursor.fetchall()
for house in houses:
number, owner, house_class, garage_spaces, price = house
owner = owner.replace('\"', '"').strip()
if owner == '<span class="green-text">Нет</span>':
if number not in sent_houses:
logger.info(f'Слетевший дом: {house}') # Диагностика
embed = discord.Embed(title=f"Дом #{number}", color=discord.Color.green())
embed.add_field(name="Владелец", value="Нет", inline=False)
embed.add_field(name="Класс", value=house_class, inline=False)
embed.add_field(name="Гаражных мест", value=garage_spaces, inline=False)
embed.add_field(name="Цена", value=f"${price:,}", inline=False)
embed.add_field(name="Статус", value="Свободен", inline=False)
message = await send_discord_message(embed, "дом", number)
if message:
sent_houses[number] = {'message_id': message.id, 'status': "Свободен"}
elif sent_houses[number]['status'] == "Свободен":
channel = client.get_channel(CHANNEL_ID)
if channel:
message = await channel.fetch_message(sent_houses[number]['message_id'])
embed = message.embeds[0]
embed.set_field_at(0, name="Владелец", value="Нет", inline=False)
await message.edit(embed=embed)
else:
if number in sent_houses:
channel = client.get_channel(CHANNEL_ID)
if channel:
message = await channel.fetch_message(sent_houses[number]['message_id'])
embed = message.embeds[0]
embed.set_field_at(0, name="Владелец", value=owner, inline=False)
embed.set_field_at(-1, name="Статус", value="Выкуплен", inline=False)
await message.edit(embed=embed)
del sent_houses[number]
cursor.execute("SELECT number, owner, type, name, price FROM businesses")
businesses = cursor.fetchall()
excluded_businesses = [
'Электро-Станция Маленький Сеул №2',
'Электро-Станция Маленький Сеул №1',
'Электро-Станция Строберри',
'Электро-Станция Дэвис №1',
'Электро-Станция Дэвис №2'
]
for business in businesses:
number, owner, business_type, name, price = business
owner = owner.replace('\"', '"').strip()
if name in excluded_businesses:
continue
if owner == '<span class="green-text">Нет</span>':
if number not in sent_businesses:
logger.info(f'Слетевший бизнес: {business}') # Диагностика
embed = discord.Embed(title=f"Бизнес #{number}", color=discord.Color.green())
embed.add_field(name="Владелец", value="Нет", inline=False)
embed.add_field(name="Тип", value=business_type, inline=False)
embed.add_field(name="Название", value=name, inline=False)
embed.add_field(name="Цена", value=f"${price:,}", inline=False)
embed.add_field(name="Статус", value="Свободен", inline=False)
message = await send_discord_message(embed, "бизнес", number)
if message:
sent_businesses[number] = {'message_id': message.id, 'status': "Свободен"}
elif sent_businesses[number]['status'] == "Свободен":
channel = client.get_channel(CHANNEL_ID)
if channel:
message = await channel.fetch_message(sent_businesses[number]['message_id'])
embed = message.embeds[0]
embed.set_field_at(0, name="Владелец", value="Нет", inline=False)
await message.edit(embed=embed)
else:
if number in sent_businesses:
channel = client.get_channel(CHANNEL_ID)
if channel:
message = await channel.fetch_message(sent_businesses[number]['message_id'])
embed.set_field_at(0, name="Владелец", value=owner, inline=False)
embed.set_field_at(-1, name="Статус", value="Выкуплен", inline=False)
await message.edit(embed=embed)
del sent_businesses[number]
class ClaimButton(discord.ui.Button):
def __init__(self, entity_type, entity_id):
super().__init__(label="Взять", style=discord.ButtonStyle.green)
self.entity_type = entity_type
self.entity_id = entity_id
async def callback(self, interaction: discord.Interaction):
if self.entity_type == "дом":
if sent_houses[self.entity_id]['status'] == "Свободен":
sent_houses[self.entity_id]['status'] = f"{interaction.user.mention} полетел ловить"
embed = interaction.message.embeds[0]
embed.set_field_at(-1, name="Статус", value=f"{interaction.user.mention} полетел ловить", inline=False)
await interaction.message.edit(embed=embed)
await interaction.response.send_message(f"{interaction.user.mention} полетел ловить", ephemeral=True)
else:
await interaction.response.send_message(
f"Данный дом уже взял {sent_houses[self.entity_id]['status']}", ephemeral=True
)
elif self.entity_type == "бизнес":
if sent_businesses[self.entity_id]['status'] == "Свободен":
sent_businesses[self.entity_id]['status'] = f"{interaction.user.mention} полетел ловить"
embed = interaction.message.embeds[0]
embed.set_field_at(-1, name="Статус", value=f"{interaction.user.mention} полетел ловить", inline=False)
await interaction.message.edit(embed=embed)
await interaction.response.send_message(f"{interaction.user.mention} полетел ловить", ephemeral=True)
else:
await interaction.response.send_message(
f"Данный бизнес уже взял {sent_businesses[self.entity_id]['status']}", ephemeral=True
)
async def send_discord_message(embed, entity_type, entity_id):
channel = client.get_channel(CHANNEL_ID)
if not channel:
logger.error(f"Не удалось найти канал с ID {CHANNEL_ID}")
return None
# Проверка прав
permissions = channel.permissions_for(channel.guild.me)
if not permissions.send_messages:
logger.error(f"Бот не имеет прав на отправку сообщений в канал с ID {CHANNEL_ID}")
return None
view = discord.ui.View()
view.add_item(ClaimButton(entity_type, entity_id))
try:
message = await channel.send(embed=embed, view=view)
return message
except discord.Forbidden:
logger.error(f"Запрещено отправлять сообщения в канал с ID {CHANNEL_ID}")
return None
except discord.HTTPException as e:
logger.error(f"Ошибка отправки сообщения в канал с ID {CHANNEL_ID}: {e}")
return None
def setup_logging():
import logging
from logging.handlers import TimedRotatingFileHandler
import os
log_dir = 'logs'
if not os.path.exists(log_dir):
os.makedirs(log_dir)
log_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
log_handler = TimedRotatingFileHandler(
filename=os.path.join(log_dir, 'logfile.log'),
when='midnight',
interval=1,
backupCount=7,
encoding='utf-8'
)
log_handler.setFormatter(log_formatter)
log_handler.suffix = "%Y-%m-%d"
logger = logging.getLogger()
logger.setLevel(logging.INFO)
logger.addHandler(log_handler)
logger.propagate = False
if __name__ == "__main__":
setup_logging()
client.run(DISCORD_TOKEN)
I also looked at the work of other people, they did everything the same, but it worked for them
I don’t know what else to add here to pass verification from the site: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
サハラのアバカド is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.