Я пытаюсь создать сайт на котором можно было бы удобно общаться с клиентами с разных тг аккаунтов и пришел к использованию socketio, часть кода работает нормально, но почему то когда приходит новое сообщение socketio либо не отдает либо не принимает запрос и никаких ошибок не выдает. Исходники:
app.py
db = SQLAlchemy(app)
socketio = SocketIO(app, cors_allowed_origins="*", async_mode='eventlet')
class Client(db.Model):
__tablename__ = 'clients'
user_id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String, nullable=True)
phone = db.Column(db.String, nullable=True)
first_name = db.Column(db.String, nullable=True)
last_name = db.Column(db.String, nullable=True)
first_added = db.Column(db.String, nullable=True)
last_updated = db.Column(db.String, nullable=True)
avatar = db.Column(db.String, nullable=True)
unread = db.Column(db.Integer, nullable=True)
last_message = db.Column(db.String, nullable=True)
# Модель Message для таблицы messages
class Message(db.Model):
__tablename__ = 'messages'
id = db.Column(db.Integer, primary_key=True)
account_number = db.Column(db.String, nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('clients.user_id'), nullable=False)
message = db.Column(db.Text, nullable=False)
sender_type = db.Column(db.String, nullable=False)
timestamp = db.Column(db.String, nullable=False)
@socketio.on('chat_history')
def handle_chat_history(data):
account_id = data.get('account_id')
if not account_id:
return jsonify({'error': 'Account ID not provided'}), 400
# Загружаем историю чатов из базы данных
chat_history = Message.query.filter_by(user_id=account_id).order_by(Message.timestamp).all()
chat_data = [
{
'message': message.message,
'sender_type': message.sender_type,
'timestamp': datetime.strptime(message.timestamp.split(" (")[0], "%Y-%m-%d %H:%M:%S").strftime("%H:%M")
}
for message in chat_history
]
print(type(account_id))
join_room(room=account_id) # Подключение клиента к комнате
socketio.emit('chat_history_response', chat_data, room=account_id)
async def message_handler(client,phone):
await client.connect()
@client.on(events.NewMessage)
async def handler(event):
try:
message_text = event.message.message
user = await event.get_sender()
if user.id in [777000, 178220800] or event.is_channel or event.is_group:
return
username = user.username or "Unknown"
first_name = user.first_name or ""
last_name = user.last_name or ""
account = await client.get_me()
sender_type = "self" if user.id == account.id else "user"
avatar = AVATARS_DIR + f"/{user.id}"
if not os.path.exists(avatar):
await client.download_profile_photo(user.id, avatar)
room_id = str(user.id)
print(type(room_id))
timestamp = format_timestamp(event.date)
save_message(phone, user.id, username, message_text, sender_type, timestamp, new=True)
add_or_update_client(user.id, username, user.phone, first_name, last_name, account.id, avatar, 1, message_text)
except Exception as e:
print(e)
@app.route('/')
def index():
clients = Client.query.all()
client_data = []
for client in clients:
timestamp = client.last_updated
time_obj = datetime.strptime(timestamp, "%Y-%m-%d %H:%M:%S.%f")
time_only = time_obj.strftime("%H:%M")
client_data.append({
'username': client.username,
'user_id': str(client.user_id),
'first_name': client.first_name,
'last_name': client.last_name,
'last_message': client.last_message,
'unread': True if client.unread == 1 else False,
'avatar': client.avatar,
'timestamp': time_only,
})
return render_template('index.html', chats=client_data)
// Настраиваем соединение с Socket.IO
const socket = io.connect('http://' + document.domain + ':' + location.port);
const chatWindow = document.getElementById('chat-window');
const chatMessages = document.getElementById('chat-messages');
const chatInput = document.getElementById('chat-input');
const messageInput = document.getElementById('message-input');
const chatPlaceholder = document.getElementById('chat-placeholder');
let currentChatId = null;
// Функция для выбора чата и загрузки истории сообщений
function selectChat(chatId, chatName) {
// Проверка на наличие элементов перед изменением их стиля
if (chatWindow) {
chatWindow.style.display = 'block';
}
if (chatInput) {
chatInput.style.display = 'flex';
}
if (chatPlaceholder) {
chatPlaceholder.style.display = 'none';
}
// Устанавливаем текущий ID выбранного чата
currentChatId = chatId;
document.getElementById('chat-name').innerText = chatName;
// Очищаем окно сообщений перед загрузкой нового чата
chatMessages.innerHTML = '';
console.log("Проверка лога");
// Отправляем запрос на получение истории сообщений для выбранного чата
socket.emit('chat_history', { account_id: chatId });
}
// Получение истории сообщений с сервера
socket.on('chat_history_response', function(chatData) {
chatMessages.innerHTML = ''; // Очистка сообщений перед обновлением
if (Array.isArray(chatData)) {
chatData.forEach(message => {
const messageElement = document.createElement('div');
messageElement.className = 'chat-message ' + (message.sender_type === 'self' ? 'self-message' : 'user-message');
messageElement.innerHTML = `
<div class="message-content">${message.message}</div>
<div class="message-timestamp">${message.timestamp}</div>
`;
chatMessages.appendChild(messageElement);
});
}
});
// Отправка сообщения
function sendMessage() {
const messageText = messageInput.value.trim();
if (messageText && currentChatId) {
// Отправляем сообщение на сервер
socket.emit('send_message', { account_id: currentChatId, message: messageText });
// Отображаем отправленное сообщение в чате
const messageElement = document.createElement('div');
messageElement.className = 'chat-message self-message';
messageElement.innerHTML = `
<div class="message-content">${messageText}</div>
<div class="message-timestamp">${new Date().toLocaleTimeString().slice(0, 5)}</div>
`;
chatMessages.appendChild(messageElement);
messageInput.value = ''; // Очищаем поле ввода
}
}
// Получаем новое сообщение от сервера
socket.on('receive_message', function(data) {
console.log("Получен recieve от сокета");
console.log(currentChatId);
if (data.account_id === currentChatId) {
console.log(2)
const messageElement = document.createElement('div');
messageElement.className = 'chat-message user-message';
messageElement.innerHTML = `
<div class="message-content">${data.message}</div>
<div class="message-timestamp">${data.timestamp}</div>
`;
chatMessages.appendChild(messageElement);
}
});
// Обработчик выбора чата
document.querySelectorAll('.chat-item').forEach(chatItem => {
chatItem.addEventListener('click', function() {
const chatId = this.getAttribute('data-chat-id');
const chatName = this.querySelector('.chat-name').innerText;
selectChat(chatId, chatName);
});
});
Код не весь, но это основная проблемная логика