Задать вопрос
@mays126

Почему Socket.io не отправляет/принимает запрос?

Я пытаюсь создать сайт на котором можно было бы удобно общаться с клиентами с разных тг аккаунтов и пришел к использованию 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);
    });
});

Код не весь, но это основная проблемная логика
  • Вопрос задан
  • 63 просмотра
Подписаться 1 Средний 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы