79 lines
3.1 KiB
Go
79 lines
3.1 KiB
Go
package app
|
||
|
||
import (
|
||
"fmt"
|
||
"time"
|
||
|
||
"botpontos/internal/domain"
|
||
"botpontos/internal/rules"
|
||
)
|
||
|
||
// Textos enviados pelo Telegram. Ficam juntos para facilitar a revisão.
|
||
|
||
func msgNewRegistration(u domain.User) string {
|
||
return fmt.Sprintf("Novo pedido de cadastro: %s (ID %d).\n"+
|
||
"Configure a credencial da PontoMais no painel e ative com /ativarusuario %d ou pelo painel.",
|
||
u.DisplayName, u.ID, u.ID)
|
||
}
|
||
|
||
const msgActivated = "Seu cadastro foi aprovado. Envie /ativarponto para ligar os lembretes e /ajuda para ver os comandos."
|
||
|
||
const msgDisabledByAdmin = "Seu acesso ao Bot de Pontos foi desativado por um administrador."
|
||
|
||
func msgPausedAPIFailures(failures int) string {
|
||
return fmt.Sprintf("Não consegui consultar a PontoMais %d vezes seguidas, então pausei seus lembretes.\n"+
|
||
"Confira com o administrador se sua credencial está correta e depois envie /ativarponto.", failures)
|
||
}
|
||
|
||
func msgAdminUserPaused(u domain.User, failures int, err error) string {
|
||
return fmt.Sprintf("Lembretes de %s (ID %d) pausados após %d falhas seguidas na PontoMais.\nÚltimo erro: %s",
|
||
u.DisplayName, u.ID, failures, shortError(err))
|
||
}
|
||
|
||
func msgOutageStarted(users int, err error) string {
|
||
return fmt.Sprintf("A PontoMais parece fora do ar: as consultas de %d usuários falharam no mesmo ciclo.\n"+
|
||
"Ninguém foi pausado. Último erro: %s", users, shortError(err))
|
||
}
|
||
|
||
func msgOutageEnded(duration time.Duration) string {
|
||
return fmt.Sprintf("A PontoMais voltou a responder. A queda durou cerca de %s.", formatDuration(duration))
|
||
}
|
||
|
||
func msgHolidayFallback(year int, err error) string {
|
||
return fmt.Sprintf("Não consegui obter os feriados de %d (%s).\n"+
|
||
"Enquanto isso, segunda a sexta contam como dias úteis. Cadastre feriados manualmente no painel se necessário.",
|
||
year, shortError(err))
|
||
}
|
||
|
||
func msgScheduleViolations(names []string, interval time.Duration) string {
|
||
return fmt.Sprintf("Estes usuários têm almoço − antecedência menor que o intervalo de reconciliação (%s) e podem receber "+
|
||
"o lembrete de retorno atrasado: %v. Ajuste a jornada no painel.", formatDuration(interval), names)
|
||
}
|
||
|
||
// msgReminder é o lembrete automático; sempre informa o horário previsto (9.3).
|
||
func msgReminder(n domain.Notification, loc *time.Location, schedule domain.WorkSchedule, now time.Time) string {
|
||
clock := rules.FormatClock(n.PredictedAt, loc)
|
||
late := now.After(n.PredictedAt)
|
||
switch n.Type {
|
||
case domain.NotificationEntrada2:
|
||
if late {
|
||
return "⏰ Lembrete: seu retorno do almoço estava previsto para " + clock + "."
|
||
}
|
||
return "⏰ Lembrete: seu retorno do almoço está previsto para " + clock + "."
|
||
default:
|
||
jornada := rules.FormatMinutes(schedule.DailyWorkMinutes)
|
||
if late {
|
||
return "⏰ Lembrete: sua saída estava prevista para " + clock + " (jornada de " + jornada + ")."
|
||
}
|
||
return "⏰ Lembrete: sua saída está prevista para " + clock + " (jornada de " + jornada + ")."
|
||
}
|
||
}
|
||
|
||
func formatDuration(d time.Duration) string {
|
||
minutes := int(d.Round(time.Minute) / time.Minute)
|
||
if minutes < 60 {
|
||
return fmt.Sprintf("%d min", minutes)
|
||
}
|
||
return rules.FormatMinutes(minutes)
|
||
}
|