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 преобразуешь? Какой инструмент, какая конкретно команда?
Телепаты в отпуске, пиши детали сам.
Что за ошибка? Есть ли такой элемент на странице при ручном просмотре? А если сохранить скачанную скриптом страницу в файл - он есть? Отдел телепатов на карантине, уточняйте вопрос сами.
Вообще я бы посоветовал изменть структуру базы данных.
Таблица предметов - отдельно, таблица учеников - отдельно, а таблица оценок на них ссылается. Это азы проектирования БД.
Потому что сейчас если у вас изменится список предметов, что будете делать? Править все таблицы и запросы?
Даниил Шевкунов, имейте ввиду, что не стоит так сравнивать дробные числа.
Они могут отличаться очень незначительно, скажем,
7.0000000000000000000000001 вместо 7.
Поэтому их лучше сравнивать как
np.isclose(matrix, 7.0, atol=0.0001) где 0.0001 - желаемая точность сравнения
ut1ka, я уже написал выше. Ваши собственные слова (выделение моё):
def izmproc(call, user_type, user_id)
она возвращает
return user_id
Т.е. чтобы izmproc() могла вернуть user_id, ей нужно при вызове передать это значение как третий параметр. Т.е. вызывающая функция (в вашем случае proc_cas(), если я верно понял) УЖЕ должна знать user_id, чтобы отдать его izmproc().
Поэтому сам вопрос "как передать переменную user_id из izmproc" просто не имеет смысла. Вы не можете получить ничего от izmproc() если вы её не вызовите, и вы не можете её вызвать, если у вас нет значения user_id. Вам нужно получить user_id каким-то другим путём.
Каким? Без понятия, для этого нужно знать, что за задачу вы пытаетесь решить, и как именно. У меня просто нет времени в этом вникать.
Марк Ешкилев, потому что "родительский" (внешний) фрейм может отслеживать происходящее во внутреннем, в т.ч. нажатия клавиш (ввод пароля). Так что с "сайт в сайте" многие ресурсы активно борются.
Функции izmproc нужен определённый набор данных для работы: call, user_type, user_id
> таких данных в функции proc_cas нет
Значит вызвать функцию izmproc вы оттуда не можете. Точка.
Либо сделайте так, чтобы эти данные в proc_cas были (передайте их как параметры, или получите откуда-то ещё), либо найдите способ обойтись без izmproc. Третьего не дано.
Samad_Samadovic, стооооп, ну кто ж так делает! Избегайте втыкать строки прямо в тело запроса, это прямой путь к поломанным запросам и SQL-инъекциям.
cur.execute(f'UPDATE Home_work SET {For_lesons[lug]} = ? WHERE id = ?', (CVB, 1))
Вместо каждого ? sqlite поставит очередной элемент из кортежа. Но это работает только для значений, а не для имён столбцов. Вот почему я оставил For_lesons[lug] на месте, а не вынес его в кортеж.
Samad_Samadovic, будет в разы более читаемо.
Далее, вам нужно просто передать одну строку как параметр запроса? Или у вас в строке несколько параметров, и вы хотите их разделить? Это совершенно разные вопросы, и вам ответили на второй.
На первый ответ проще: ('Hello world!', ) Запятая значима!
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(). Выполняем команду. Конец алгоритма.