1 Востаннє редагувалося "mamkin haker" (09.05.2021 22:12:29)

Тема: if else | datetime | pyrogram

Вітаю
Виникла думка "А чи не можна якось скоротити цей кусочок кода"

Прихований текст
#розклад уроків | телеграм
def foo():
    while True:
        day = datetime.datetime.today().weekday()

        if day > 4:
            break

        houre = int(datetime.datetime.today().strftime("%H"))
        minute = int(datetime.datetime.today().strftime("%M"))

        if day == 0:
            if houre == 11 and minute == 38:
                app.send_message(chat_id, 'інформатика (11.40 - 13.00)\n'+l.inf)
            elif houre == 13 and minute == 28:
                app.send_message(chat_id, 'інформатика (13.30 - 14.50)\n'+l.inf)
                break
        elif day == 1:
            if houre == 11 and minute == 38:
                app.send_message(chat_id, 'фізіологія (11.40 - 13.00)')
            elif houre == 13 and minute == 28:
                app.send_message(chat_id, 'чото там еще :D (13.30 - 14.50)\nSkype')
                break
        elif day == 2:
            if houre == 10 and minute == 3:
                app.send_message(chat_id, 'англійська (10.05 - 11.25)\n'+l.eng)
                break
        elif day == 3:
            if houre == 10 and minute == 3:
                app.send_message(chat_id, 'чото там еще :D (10.05 - 11.25)\nSkype')
            elif houre == 11 and minute == 38:
                app.send_message(chat_id, 'чото там еще :D  (11.40 - 13.00)\nSkype')
                break
        elif day == 4:
            if houre == 10 and minute == 3:
                app.send_message(chat_id, 'геометрія (10.05 - 11.25)\n '+l.gm)
            elif houre == 11 and minute == 38:
                app.send_message(chat_id, 'алгебра (11.40 - 13.00)\n'+l.alg)
            elif houre == 13 and minute == 28:
                app.send_message(chat_id, 'алгебра (13.30 - 14.50)\n'+l.alg)
                break

        time.sleep(60)

t = threading.Thread(target = foo)
t.start()

Думка то виникла а от ідеї які були придумані щоб це реалізовати були погані

Як на вашу думку це можливо зробити? Якщо так, то буду далі думати =(

2

Re: if else | datetime | pyrogram

це я сліпий, чи цей код таки ідентичний?

 if houre == 0 and minute == 0:
                bot.send_message(chat_id, 'букави')
            elif houre == 0 and minute == 0:
                bot.send_message(chat_id, 'букави')
            elif houre == 0 and minute == 0:
                bot.send_message(chat_id, 'букави')

3

Re: if else | datetime | pyrogram

FakiNyan написав:

це я сліпий, чи цей код таки ідентичний?

 if houre == 0 and minute == 0:
                bot.send_message(chat_id, 'букави')
            elif houre == 0 and minute == 0:
                bot.send_message(chat_id, 'букави')
            elif houre == 0 and minute == 0:
                bot.send_message(chat_id, 'букави')

:D там у всіх днях різні назви предметів і силки це я так, для прикладу

4

Re: if else | datetime | pyrogram

"mamkin haker" написав:
FakiNyan написав:

це я сліпий, чи цей код таки ідентичний?

 if houre == 0 and minute == 0:
                bot.send_message(chat_id, 'букави')
            elif houre == 0 and minute == 0:
                bot.send_message(chat_id, 'букави')
            elif houre == 0 and minute == 0:
                bot.send_message(chat_id, 'букави')

:D там у всіх днях різні назви предметів і силки це я так, для прикладу

то напишіть нормально

5

Re: if else | datetime | pyrogram

FakiNyan написав:

то напишіть нормально

всьо

6 Востаннє редагувалося koala (10.05.2021 08:06:48)

Re: if else | datetime | pyrogram

Ну, для початку - такий код має викликатися cron-ом, а не висіти в пам'яті.

Далі - "магічні значення" та повторення в коді є злом. Тут повторюється один і той самий фрагмент, залежний від констант - значить, їх можна зібрати в масив чи словник:

SCHEDULE = {0:[(11,40,'інформатика',l.inf),
               (13,30,'інформатика',l.inf)
              ],
            1:[(11,40,'фізіологія',''),
               (13,30,'щось ще','\nSkype')
              ],
            ...}
...
for sched_hour, sched_min, sched_name, sched_suffix in SCHEDULE[day]:
  alarm_min = sched_min-2
  if alarm_min<0:
    alarm_min += 60
    alarm_hour -= 1
 if hour==alarm_hour and minute==alarm_min:
    end_hour = sched_hour+1
    end_min = sched_min + 20
    if end_min>=60:
        end_min -= 60
        end_hour += 1
   app.send_message(chat_id, f'{sched_name} ({sched_hour}.{sched_min} - {end_hour}.{end_min}){sched_suffix}')
   break

Виникли нові "магічні числа" і багато однотипних операцій з часом, прибираємо:

SCHEDULE = [
              [(11,40,'інформатика',l.inf),
               (13,30,'інформатика',l.inf)
              ],
              [(11,40,'фізіологія',''),
               (13,30,'щось ще','\nSkype')
              ],
            ...]
HOURS_IN_DAY = 24
MINUTES_IN_HOUR = 60
MINUTES_BEFORE_ALARM = 2
CLASS_DURATION = 80
def add_time(h, m, dm):
    m += dm
    while m < 0:
        m += MINUTES_IN_HOUR
        h -= 1
    while m >= MINUTES_IN_HOUR:
        m -= MINUTES_IN_HOUR
        h += 1
    h %= HOURS_IN_DAY
    return (h,m)

...

for sched_hour, sched_min, sched_name, sched_suffix in SCHEDULE[day]:
    if (hour, minute)==add_time(sched_hour, sched_min, - MINUTES_BEFORE_ALARM):
        end_hour, end_min = add_time(sched_time, CLASS_DURATION)
        app.send_message(chat_id, f'{sched_name} ({sched_hour}.{sched_min} - {end_hour}.{end_min}){sched_suffix}')
        break

Хоча взагалі треба переробляти час на стандартні часові типи.
Також можна кожен рядок в розкладі переробити на окремий об'єкт, що вміє повертати час та опис як str, але то вже на свій смак. І взагалі треба таку табличку з бази викачувати, а не хардкодити.

7 Востаннє редагувалося koala (10.05.2021 08:09:39)

Re: if else | datetime | pyrogram

Ще трохи функцію підправлю:

def add_time(h, m, dm):
    dh, m = divmod(m+dm, MINUTES_IN_HOUR)
    return ((h+dh)%HOURS_IN_DAY, m)

8

Re: if else | datetime | pyrogram

А ще можна переробити списки в днях на словники за часом, тоді й цикл не потрібен:

SCHEDULE = [
              {(11,40):('інформатика',l.inf),
               (13,30):('інформатика',l.inf)
              },
              {(11,40):('фізіологія',''),
               (13,30):('щось ще','\nSkype')
              },
            ...]
HOURS_IN_DAY = 24
MINUTES_IN_HOUR = 60
MINUTES_BEFORE_ALARM = 2
CLASS_DURATION = 80
def add_time(h, m, dm):
    dh, m = divmod(m+dm, MINUTES_IN_HOUR)
    return ((h+dh)%HOURS_IN_DAY, m)

...
time_to_alarm = add_time(hour, min, MINUTES_BEFORE_ALARM)
if time_to_alarm in SCHEDULE[day]:
    sched_name, sched_suffix = SCHEDULE[day][time_to_alarm]:
    end_hour, end_min = add_time(time_to_alarm[0], time_to_alarm[1], CLASS_DURATION)
    app.send_message(chat_id, f'{sched_name} ({sched_hour}.{sched_min} - {end_hour}.{end_min}){sched_suffix}')
Подякували: "mamkin haker"1

9 Востаннє редагувалося "mamkin haker" (10.05.2021 09:48:50)

Re: if else | datetime | pyrogram

Дякую.
Кому цікаво, ось фінальний результат

Прихований текст
SCHEDULE = [{(8,30):('інформатика',l.inf),
             (13,30):('інформатика',l.inf)},
            
            {(11,40):('фізіологія',''),
             (13,30):('щось ще','\nSkype')}]

HOURS_IN_DAY = 24
MINUTES_IN_HOUR = 60
MINUTES_BEFORE_ALARM = 2
CLASS_DURATION = 80

def add_time(h, m, dm):
    dh, m = divmod(m+dm, MINUTES_IN_HOUR)
    return ((h+dh)%HOURS_IN_DAY, m)

def foo():
    while True:
                #так як це пайрограм, клієнту потрібен час щоб запуститись, тому підключивши поток 
                # sleep стоїть на початку
        time.sleep(60)
        day = datetime.datetime.today().weekday()
        hour = int(datetime.datetime.today().strftime("%H"))
        minutes = int(datetime.datetime.today().strftime("%M"))
        time_to_alarm = add_time(hour, minutes, MINUTES_BEFORE_ALARM)
        if time_to_alarm in SCHEDULE[day]:
            sched_name, sched_suffix = SCHEDULE[day][time_to_alarm]
            sched_hour, sched_min = time_to_alarm[0], time_to_alarm[1]
            end_hour, end_min = add_time(time_to_alarm[0], time_to_alarm[1], CLASS_DURATION)
            app.send_message(chat_id, f'{sched_name} ({sched_hour}.{sched_min} - {end_hour}.{end_min})\n{sched_suffix}')

t1 = threading.Thread(target = foo)
t1.start()

upd: забрав прінти :D

10

Re: if else | datetime | pyrogram

Додаткова проблема: time.sleep гарантує лише, що пауза буде не меншою за вказану. Тобто є імовірність пропустити подію. Треба показувати повідомлення для всіх подій, що вже настали, і видаляти їх (або позначати виконаними).

Подякували: "mamkin haker", leofun012

11

Re: if else | datetime | pyrogram

koala написав:

Додаткова проблема: time.sleep гарантує лише, що пауза буде не меншою за вказану. Тобто є імовірність пропустити подію. Треба показувати повідомлення для всіх подій, що вже настали, і видаляти їх (або позначати виконаними).

та я з цею паузою уже з лютого живу і ще ніразу не пропустилось :D

12

Re: if else | datetime | pyrogram

mamkin haker написав:

та я з цею паузою уже з лютого живу і ще ніразу не пропустилось :D

Імовірність насправді досить мала. Але не нульова.
А де ви це запускаєте? Які ОС, ваші права на машині?

13

Re: if else | datetime | pyrogram

koala написав:
mamkin haker написав:

та я з цею паузою уже з лютого живу і ще ніразу не пропустилось :D

Імовірність насправді досить мала. Але не нульова.
А де ви це запускаєте? Які ОС, ваші права на машині?

У себе на ПК.
ОС linux mint 20.1

14

Re: if else | datetime | pyrogram

man cron

Подякували: leofun011

15

Re: if else | datetime | pyrogram

koala написав:

man cron

German (detected)
людина крон?

16

Re: if else | datetime | pyrogram

Ви хочете сказати, що маєте лінукс на комп'ютері і не знаєте консольної команди man?

Подякували: "mamkin haker"1

17

Re: if else | datetime | pyrogram

koala написав:

Ви хочете сказати, що маєте лінукс на комп'ютері і не знаєте консольної команди man?

та я з windows 10 тільки недавно пішов, цікава команда, потім почитаю