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:
julio
2026-10-08 08:13:03 -03:00
co-authored by Claude Opus 5.5
parent 43770c6d67
commit 4777ceb023
19 changed files with 1179 additions and 30 deletions
+36 -1
View File
@@ -142,6 +142,11 @@ class Vida:
self.madrugada = self.noite_padrao # o main troca pelo horário dos ajustes
self.interagiu_em = 0.0
self.pir_eventos = []
# Atividades criadas por IA (estúdio e ideias do dia) entram na rotina; as de hoje saem mais.
self.novidades = lambda: [] # [{id, nome, emoji, receita, motivo, aprendi, ...}]
self.do_dia = lambda: [] # ids das ideias de hoje
self.aprendi_pendente = lambda: None # curiosidade de hoje que ainda dá para contar
self.contar_aprendi = lambda ident, agora=None: None
agora = time.time()
self.config = dict(PADRAO)
@@ -342,7 +347,18 @@ class Vida:
self.anotar('sono', motivo, agora)
def escolher_atividade(self):
"""Pelo pique: cansado prefere coisas calmas (e às vezes um café); cheio de energia, coisas agitadas."""
"""Pelo pique: cansado prefere coisas calmas (e às vezes um café); cheio de energia, coisas agitadas.
As atividades criadas por IA também entram: as ideias de hoje com bastante chance, as antigas às vezes."""
try:
novas = [n for n in self.novidades() if 'criado:%d' % n['id'] != self.ultima_atividade]
hoje = set(self.do_dia())
except Exception:
novas, hoje = [], set()
de_hoje = [n for n in novas if n['id'] in hoje]
if de_hoje and self.rng.random() < 0.4:
return 'criado:%d' % self.rng.choice(de_hoje)['id']
if novas and self.rng.random() < 0.12:
return 'criado:%d' % self.rng.choice(novas[:20])['id']
e = self.necessidades['energia']
if 35 <= e < 55 and self.rng.random() < 0.35:
return 'cafe'
@@ -356,6 +372,17 @@ class Vida:
return self.rng.choice(opcoes)
def comecar_atividade(self, agora, nome, segundos):
if nome.startswith('criado:'):
item = next((n for n in self.novidades() if 'criado:%d' % n['id'] == nome), None)
if item:
receita = dict(item['receita'], duracao=int(segundos))
self.enfileirar('atividade_criada ' + json.dumps(receita, ensure_ascii=False, separators=(',', ':')))
self.atividade_em = agora
self.ultima_atividade = nome
motivo = ' (' + item['motivo'] + ')' if item.get('motivo') else ''
self.anotar('atividade', 'Foi fazer %s %s%s' % (item['emoji'], item['nome'], motivo), agora)
return 'atividade ' + nome
nome = self.rng.choice(CALMAS) # apagaram a criação no meio do caminho
self.enfileirar('atividade %s %d' % (nome, segundos))
self.atividade_em = agora
self.ultima_atividade = nome
@@ -468,6 +495,14 @@ class Vida:
if perto:
self.visto_em = agora
sozinho = agora - self.visto_em > SOZINHO
# alguém por perto e ele aprendeu algo hoje: "Olha o que eu aprendi hoje!"
if dia and perto and humor != 'bravo':
item = self.aprendi_pendente()
if item and self.rng.random() < 0.3:
self.contar_aprendi(item['id'], agora)
with self.lock:
n['social'] = _limitar(n['social'] + 5)
return 'aprendi'
if dia and folga and sozinho and self.rng.random() < 0.4:
return self.comecar_atividade(agora, self.escolher_atividade(), self.rng.uniform(60, 180))
# bem: de vez em quando, uma atividade curtinha por vontade própria