feat(vida): ideias do dia com inspiração da internet e "olha o que eu aprendi"
Todo dia, a partir das 9h, o Carinha cria 3 atividades novas (inspiracao.py): - sinais de fontes abertas: tempo da cidade (Open-Meteo), datas comemorativas da semana (lista fixa + feriados da BrasilAPI), "neste dia" da Wikipédia e assuntos em alta no Google Trends Brasil; - o Gemini escolhe ideias leves (descarta tragédia, política e afins) e cada uma vira atividade pelo estúdio (Criacao.gerar), com motivo e uma curiosidade; - até 3 tentativas por dia, 30 min entre elas; botão "Criar mais agora"; - as atividades criadas entram na rotina do modo vida (as de hoje com 40% de chance) e, com alguém perto, ele conta a curiosidade: legenda e voz de robô (ordem "aprendi", até 2x por dia cada); - painel: cartão "Ideias do dia" no estúdio (Mostrar, Contar, o que ele viu na internet, ajustes: quantas, horário, cidade, fontes) e tópico no guia. Correções achadas no caminho: - WebView de fábrica do S10 (Chrome 102) não tem AbortSignal.timeout: o celular nunca mandava o status e a placa o via offline; - arquivos estáticos com Cache-Control no-cache e o app com LOAD_NO_CACHE: o WebView seguia com uma carinha.html velha depois de deploy; - status do celular recusado vai para o journal (1 linha por minuto); - legenda mais estreita para não cobrir a bateria. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
+27
-2
@@ -43,6 +43,7 @@ from api_config import ConfigAPI
|
||||
from historico import Historico
|
||||
from vida import Vida
|
||||
from criacao import Criacao
|
||||
from inspiracao import Inspiracao
|
||||
|
||||
TRAVA = threading.Lock()
|
||||
|
||||
@@ -220,6 +221,20 @@ class Handler(SimpleHTTPRequestHandler):
|
||||
return self.extensoes_map.get(os.path.splitext(caminho)[1].lower(),
|
||||
super().guess_type(caminho))
|
||||
|
||||
def send_header(self, chave, valor):
|
||||
if chave.lower() == "cache-control":
|
||||
self._cache_definido = True
|
||||
super().send_header(chave, valor)
|
||||
|
||||
def end_headers(self):
|
||||
# Arquivos estáticos (carinha.html, scripts, painel): o navegador pode guardar, mas confere
|
||||
# com a placa antes de usar (304 se nada mudou). Sem isso o WebView do celular seguia
|
||||
# rodando uma versão velha da página depois de um deploy.
|
||||
if not getattr(self, "_cache_definido", False):
|
||||
super().send_header("Cache-Control", "no-cache")
|
||||
self._cache_definido = False
|
||||
super().end_headers()
|
||||
|
||||
def enviar(self, corpo, tipo="application/json; charset=utf-8", codigo=200):
|
||||
dados = corpo.encode("utf-8") if isinstance(corpo, str) else corpo
|
||||
self.send_response(codigo)
|
||||
@@ -248,7 +263,7 @@ class Handler(SimpleHTTPRequestHandler):
|
||||
|
||||
def modulos(self):
|
||||
s = self.server
|
||||
return [getattr(s, nome) for nome in ("api_config", "historico", "vida", "criacao", "treinamento", "conversa", "cerebro",
|
||||
return [getattr(s, nome) for nome in ("api_config", "historico", "vida", "inspiracao", "criacao", "treinamento", "conversa", "cerebro",
|
||||
"braco", "servos", "controle") if hasattr(s, nome)]
|
||||
|
||||
def estado(self):
|
||||
@@ -468,7 +483,7 @@ class Servidor(ThreadingHTTPServer):
|
||||
|
||||
|
||||
def ligar_eventos(servidor):
|
||||
for nome in ("controle", "servos", "cerebro", "conversa", "treinamento", "historico", "vida", "criacao"):
|
||||
for nome in ("controle", "servos", "cerebro", "conversa", "treinamento", "historico", "vida", "criacao", "inspiracao"):
|
||||
if hasattr(servidor, nome):
|
||||
getattr(servidor, nome).publicar = EVENTOS.publicar
|
||||
|
||||
@@ -528,6 +543,16 @@ def main():
|
||||
vida.alguem_perto = alguem_perto
|
||||
vida.madrugada = lambda agora: madrugada(servidor.controle.config, agora)
|
||||
servidor.cerebro.vida_ligada = lambda: vida.config['ligado']
|
||||
# Ideias do dia: atividades novas inspiradas no tempo, nas datas e no que está em alta; entram na rotina
|
||||
servidor.inspiracao = inspiracao = Inspiracao(Path.cwd() / 'inspiracao.json', servidor.criacao)
|
||||
inspiracao.enfileirar = enfileirar
|
||||
inspiracao.anotar = lambda tipo, texto, agora=None: (vida.anotar(tipo, texto, agora), vida.avisar())
|
||||
inspiracao.madrugada = vida.madrugada
|
||||
inspiracao.pode_gemini = vida.pode_gemini
|
||||
vida.novidades = servidor.criacao.atividades
|
||||
vida.do_dia = lambda: inspiracao.hoje['ids']
|
||||
vida.aprendi_pendente = inspiracao.pendente
|
||||
vida.contar_aprendi = lambda ident, agora=None: inspiracao.contar(ident, agora)
|
||||
# E-Stop parado, ou modo presença com ninguém em casa (dormindo em silêncio): não faz nada
|
||||
vida.bloqueado = lambda: ESTOP["ativo"] or servidor.historico.presenca.get("estado") == "ausente"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user