LoliDeveloper, есть пара вопросов.
Первое, почему условие <=0 а не ==0? Возврат -1 означает ошибку, и не должен проглатываться. Таймаут - это именно 0.
И я вижу косяк в первом аргументе у select.
nfds This argument should be set to the highest-numbered file
descriptor in any of the three sets, plus 1. The
indicated file descriptors in each set are checked, up to
this limit (but see BUGS).
Т.е. тебе нужно s+1 туда передать.
И да, MSDN пишет:
nfds
Ignored. The nfds parameter is included only for compatibility with Berkeley sockets.
2. Ну могут быть проблемы с NAT traversal, например. Хотя если исходящая датаграмма из-за NAT пришла успешно, то по идее NAT должен открыть туннель для ответа.
3. Если sendto() успешно отправил отклик, то нужно смотреть, что приходит клиенту.
На крайняк попробуй использовать wireshark, чтобы задетектить трафик на клиенте.
А последний параметр правильно рассчитывается? Вам же recvfrom() сообщила длину addr, может, её и переиспользовать?
Ну и далее, sendto() возвращает число отправленных байт. Не помню, что возвращается при ошибке, -1 или 0, но это стоит проверить, а также посмотреть установленный код ошибки.
Наконец, точно ли есть сетевая связь между виртуалками?
Начинать всегда с чтения документации.
Гуглим "discord nodejs" (у тебя в тегах они), попадаем сюда. Тыкаем Documentation, видим слева Examples.
В частности "Server greeting" - привет при входе на сервер. Это нам пригодится, понять как научить реагировать на вход юзера на сервер.
А еще сверху есть ссылка Guide, там еще подробнее основы. Смотрим тамошний FAQ, видим вот это. Т.е. если мы знаем название роли и имеем ссылку на юзера, добавить ему роль - дело одного вызова. Этого достаточно, чтобы получить первое представление.
А дальше - шариться по описанию API, смотреть интересующие нас объекты и что они умеют, экспериментировать.
Tolic1, datetime тут избыточен, если честно. Ещё раз, алгоритм:
1. Ищем в базе ID человека, отправившего команду.
2. Если не нашли, то человек выполняет команду впервые. Добавляем (INSERT) в базу ID человека и текущую метку времени time.time(). Выполняем команду. Конец алгоритма.
3. Если в базе нашли такой ID, то выбираем метку времени из базы. Пусть это будет переменная last_time.
4. Находим разность time_diff = time.time() - last_time. Это будет число секунд, прошедших с момента последней отправки команды этим человеком.
5. Если time_diff < 24*60*60 (т.е. 24 часа по 60 минут по 60 секунд), значит, 24 часа ещё не прошло. Сообщаем человеку, что нужно подождать. Конец алгоритма.
6. Если не меньше, то 24 часа уже прошло. Обновляем (UPDATE) в базе значение метки времени для этого ID человека на текущее значение time.time(). Выполняем команду. Конец алгоритма.
Про что я и говорил. У тебя в таблице stars разрешены записи с одинаковым значением photo. Это имеет смысл в твоей задаче? Я думаю, нет. Если это не так, то поясни почему.
Поэтому таблицу надо пересоздать, сделать photo первичным ключом (PRIMARY KEY) - тогда нельзя будет иметь две или более записей с одинаковым значением photo. Как это сделать - читай в документации по sqlite.
И серьёзно, выучи уже основы SQL - понятие первичного ключа, понятие внешнего ключа, понятие индекса - там не так уж и много. Иначе будешь на каждом шагу спотыкаться при работе с БД.
hey_umbrella, я заметил. Повторю.
> VALUES (photo, 1)
вместо photo тут должно быть конкретное значение id для фотографии.
А у тебя так и осталось. Должно быть
cursor.execute('INSERT INTO stars (photo, star) VALUES (:photo, 1) ON CONFLICT (photo) DO UPDATE SET star = star + 1', {'photo': photo})
И скинь запрос CREATE TABLE, которым таблицу stars создаёшь - я подозреваю, у тебя столбец photo допускает неуникальные значения.
Гуглинг показывает ограничение то ли 200, то ли 1024 символов.
Альтернатива - послать обычное сообщение но с markdown разметкой в самом начале, чтобы встроить в него ссылку на изображение.
Также упоминается приём, где текст этой ссылки - пустой символ юникода. ФЗ работает ли сейчас.
Ну для начала что за подпись? embed? или просто надпись на картинке? Или что?
И если это API телеграма сообщает, что текст слишком длинный, значит, он слишком длинный. Как ни странно.
Оформи код кнопкой </>, а то нечитаемо.
И главное, чудила - чем в exe преобразуешь? Какой инструмент, какая конкретно команда?
Телепаты в отпуске, пиши детали сам.
Что за ошибка? Есть ли такой элемент на странице при ручном просмотре? А если сохранить скачанную скриптом страницу в файл - он есть? Отдел телепатов на карантине, уточняйте вопрос сами.
Первое, почему условие <=0 а не ==0? Возврат -1 означает ошибку, и не должен проглатываться. Таймаут - это именно 0.
И я вижу косяк в первом аргументе у select.
Т.е. тебе нужно s+1 туда передать.
И да, MSDN пишет:
Вот почему под виндой работает.