from random import random from typing import Callable, Iterable from django.conf import settings from .models import Tym, Zadost from .utils.doba import Doba # Velká část logiky je přímo na `.models.Tym`! def zadosti(tym: Tym, akce: str, choices: list, zadost: str = "Žádost", suffix: str = ""): choices.append(f"{akce} {zadost}{suffix}") if tym.zadosti.filter(typ=Zadost.TYP_BANAN, vyzvednuta=True).count() == 0: choices.append(f"{akce} {zadost} o banán{suffix}") if tym.vi_o_mase and tym.zadosti.filter(typ=Zadost.TYP_VEGE, vyzvednuta=True).count() == 0: choices.append(f"{akce} {zadost} o více vegetariánskou stravu v jídelně{suffix}") if tym.vi_o_zadosti and tym.zadosti.filter(typ=Zadost.TYP_TK, vyzvednuta=True, plati=True).count() == 0: choices.append(f"{akce} {zadost} o přístup k záznamům o třídní knize{suffix}") def get_posible_choices_casovy_vyr(doba: Doba, tym: Tym) -> list[str]: choices = ["Dopředu o hodinu", "Dopředu o 3 hodiny"] if doba > 3*doba.DEN: choices.append("Dopředu o den") if doba > doba.TYDEN: choices.append("Dopředu o týden") if tym.tk_nalezena is not None: choices += ["Dozadu o hodinu", "Dozadu o 3 hodiny", "Dozadu o den", "Dozadu o týden"] return choices def get_posible_choices_domov(doba: Doba, tym: Tym) -> list[str]: choices = [] if tym.nevyzvednute_zadosti.count() > 0: choices.append("Vyzvednout poštu") if doba.je_noc: choices.append("Spát") if not tym.ma_penize: choices.append("Vzít si chechtáky") zadosti(tym, "Tisk", choices, zadost="Žádosti") if tym.ma_ds: zadosti(tym, "Podat", choices, suffix=" datovou schránkou") return choices def get_posible_choices_posta(doba: Doba, tym: Tym) -> list[str]: if tym.ds_bad is not None and doba - tym.ds_bad < 5: return [] choices = [] if tym.zadosti.filter(vytistena=True).count() > 0: choices.append("Poslat vytištěné žádosti") if tym.nevyzvednute_zadosti.count() > 0: choices.append("Zeptat se, zda pro nás mají dopis") if not tym.ma_ds: choices.append("Zažádat o datovou schránku") if tym.ds_bad is not None: choices.append("Zažádat o datovou schránku (šeptem)") return choices def get_posible_choices_studijni(doba: Doba, tym: Tym) -> list[str]: if ( doba.cas < 8 or doba.cas > 15 or doba.den_v_tydnu >= 6 or (doba.den_v_tydnu == 5 and doba.cas > 13) ): return [] choices = [] zadosti(tym, "Podat", choices) if tym.nevyzvednute_zadosti.count(): choices.append("Zeptat se na poslané žádosti") return choices def get_posible_choices_jidelna(doba: Doba, tym: Tym) -> list[str]: if doba.cas < 8 or doba.cas > 22: return [] choices = ["Klábosit"] if tym.pocet_bananu < settings.POCET_BANANU: choices.append("Poprosit o banán") return choices def get_posible_choices_archiv(doba: Doba, tym: Tym) -> list[str]: choices = [] if not ( doba.cas < 8 or doba.cas > 16 or doba.den_v_tydnu >= 6 or (doba.den_v_tydnu == 5 and doba.cas > 14) ): if tym.ma_penize: choices.append("Uplatit knihovníka penězi") if tym.pocet_bananu > 0 and not tym.vi_o_zadosti: choices.append("Dát banán knihovníkovi") if tym.ma_platnou_zadost(Zadost.TYP_TK) and tym.tk_nalezena is None: choices.append("Ukázat knihovníkovi povolení k náhledu do záznamů o třídní knize") choices.append("Přelézt pult a sami si vzít záznamy o třídní knize") choices.append("Pokusit se sami projít kartotéku") return choices def banan(_: Doba, tym: Tym) -> None: if (tym.pocet_bananu == 0 and tym.ma_platnou_zadost(Zadost.TYP_BANAN)) or tym.ma_platnou_zadost(Zadost.TYP_VEGE): tym.pocet_bananu += 1 tym.save() print("ALERT: BANÁN!!!") return (True,) elif tym.pocet_bananu == 1: tym.vi_o_mase = True tym.save() return [] elif tym.pocet_bananu == 0: tym.ovesna_kase += 1 tym.save() return [] return [] get_posible_choices: list[Callable[[Doba, Tym], list[str]]] = [ # 0: None, # poradi začíná od 1 # 1: get_posible_choices_casovy_vyr, # 2: get_posible_choices_domov, # 3: get_posible_choices_posta, # 4: get_posible_choices_studijni, # 5: get_posible_choices_jidelna, # 6: get_posible_choices_archiv, ] apply_choice: list[dict[str, Callable[[Doba, Tym], Iterable[Zadost] | None]]] = [ # 0: {}, # poradi začíná od 1 # 1: { "Dopředu o hodinu": lambda _, tym: tym.pricti_cas_a_uloz(1), "Dopředu o 3 hodiny": lambda _, tym: tym.pricti_cas_a_uloz(3), "Dopředu o den": lambda _, tym: tym.pricti_cas_a_uloz(Doba.DEN), "Dopředu o týden": lambda _, tym: tym.pricti_cas_a_uloz(Doba.TYDEN), "Dozadu o hodinu": lambda _, tym: tym.pricti_cas_a_uloz(-1), "Dozadu o 3 hodiny": lambda _, tym: tym.pricti_cas_a_uloz(-3), "Dozadu o den": lambda _, tym: tym.pricti_cas_a_uloz(-Doba.DEN), "Dozadu o týden": lambda _, tym: tym.pricti_cas_a_uloz(-Doba.TYDEN), }, # 2: { "Vyzvednout poštu": lambda doba, tym: tym.vyzvedni_internat(doba), "Spát": lambda doba, tym: tym.pricti_cas_a_uloz((settings.DEN[0] - doba.cas + 24) % 24), "Vzít si chechtáky": lambda _, tym: tym.nastav_a_uloz("ma_penize", True), "Tisk Žádosti": lambda _, tym: tym.vytiskni_zadost(Zadost.TYP_ZADOST), "Tisk Žádosti o banán": lambda _, tym: tym.vytiskni_zadost(Zadost.TYP_BANAN), "Tisk Žádosti o více vegetariánskou stravu v jídelně": lambda _, tym: tym.vytiskni_zadost(Zadost.TYP_VEGE), "Tisk Žádosti o přístup k záznamům o třídní knize": lambda _, tym: tym.vytiskni_zadost(Zadost.TYP_TK), "Podat Žádost datovou schránkou": lambda doba, tym: tym.posli_zadost_ds(doba, Zadost.TYP_ZADOST), "Podat Žádost o banán datovou schránkou": lambda doba, tym: tym.posli_zadost_ds(doba, Zadost.TYP_BANAN), "Podat Žádost o více vegetariánskou stravu v jídelně datovou schránkou": lambda doba, tym: tym.posli_zadost_ds(doba, Zadost.TYP_VEGE), "Podat Žádost o přístup k záznamům o třídní knize datovou schránkou": lambda doba, tym: tym.posli_zadost_ds(doba, Zadost.TYP_TK), }, # 3: { "Poslat vytištěné žádosti": lambda doba, tym: tym.poslat_vytistene_zadosti(doba), "Zeptat se, zda pro nás mají dopis": lambda doba, tym: tym.vyzvedni_postu(doba), "Zažádat o datovou schránku": lambda doba, tym: tym.nastav_a_uloz("ds_bad", doba), "Zažádat o datovou schránku (šeptem)": lambda doba, tym: tym.nastav_a_uloz("ma_ds", True), }, # 4: { "Podat Žádost": lambda doba, tym: tym.posli_zadost_studijni(doba, Zadost.TYP_ZADOST), "Podat Žádost o banán": lambda doba, tym: tym.posli_zadost_studijni(doba, Zadost.TYP_BANAN), "Podat Žádost o více vegetariánskou stravu v jídelně": lambda doba, tym: tym.posli_zadost_studijni(doba, Zadost.TYP_VEGE), "Podat Žádost o přístup k záznamům o třídní knize": lambda doba, tym: tym.posli_zadost_studijni(doba, Zadost.TYP_TK), "Zeptat se na poslané žádosti": lambda doba, tym: tym.nevyzvednute_zadosti.filter(studijni__lte=doba) }, # 5: { "Klábosit": lambda *_: None, # NOOP "Poprosit o banán": banan, }, # 6: { "Uplatit knihovníka penězi": lambda *_: None, # NOOP "Dát banán knihovníkovi": lambda _, tym: tym.nastav_a_uloz("vi_o_zadosti", tym.pocet_bananu == settings.POCET_BANANU), "Ukázat knihovníkovi povolení k náhledu do záznamů o třídní knize": lambda doba, tym: tym.nastav_a_uloz("tk_nalezena", doba), "Přelézt pult a sami si vzít záznamy o třídní knize": lambda _, tym: tym.pricti_cas_a_uloz(random()*5), "Pokusit se sami projít kartotéku": lambda _, tym: tym.pricti_cas_a_uloz(5), }, ]