diff --git a/database.py b/database.py
index c612137bc448d9859fd466f9efbf12f888bb119e..789be68844bcb32d4b2d99bfd20ed136c3b0803c 100644
--- a/database.py
+++ b/database.py
@@ -1,6 +1,10 @@
 from crawler import Location, Meal
 from collections import namedtuple
+from pprint import pformat
 import sqlite3
+import logging
+
+logger = logging.getLogger("database")
 
 Schedule = namedtuple('Schedule', 'time, day_week, location, meal, user_id, created_at')
 
@@ -35,7 +39,7 @@ def get_schedules_for_user(user_id):
         row[5]
     ) for row in rows]
 
-def insert_schedule(schedule):
+def upsert_schedule(schedule):
     cur = connection.execute('''
     SELECT created_at
     FROM schedule
@@ -49,6 +53,7 @@ def insert_schedule(schedule):
     ))
     row = cur.fetchone()
     if not row:
+        logging.info(f"Inserting {pformat(schedule)}")
         connection.execute('''
         INSERT INTO schedule
         (time, day_week, location, meal, user_id, created_at)
@@ -62,13 +67,18 @@ def insert_schedule(schedule):
             schedule.user_id,
             schedule.created_at
         ))
+    else:
+        logging.info(f"Already inserted {pformat(schedule)}")
 
-def get_schedules_matching_time(time):
+def get_schedules_matching_time(datetime):
+    time = datetime.strftime('%H:%M')
+    day_week = datetime.weekday()
+    logging.info(f"Getting schedules matching time {time} and day_week {day_week}")
     cur = connection.execute('''
     SELECT time, day_week, location, meal, user_id, created_at
     FROM schedule
     WHERE time = ? and day_week = ?
-    ''', (time.strftime('%H:%M'), time.weekday()))
+    ''', (time, day_week))
     rows = cur.fetchall()
     return [Schedule(
         row[0],
diff --git a/main.py b/main.py
index ed94c1af7a6f18b0f9209c98917cc83f1a1601e9..c790916753086930e456649ebf7127337971769b 100644
--- a/main.py
+++ b/main.py
@@ -2,9 +2,9 @@
 from dotenv import load_dotenv
 from telegram import Update, InlineKeyboardMarkup, InlineKeyboardButton
 from telegram.constants import PARSEMODE_HTML
-from telegram.ext import Updater, CommandHandler, CallbackContext, CallbackQueryHandler
+from telegram.ext import Updater, CommandHandler, CallbackContext, CallbackQueryHandler, InvalidCallbackData
 from crawler import get_menus_by_days, Location, Meal
-from database import get_schedules_matching_time, insert_schedule, get_schedules_for_user, Schedule, delete_all_schedules_from_user
+from database import get_schedules_matching_time, upsert_schedule, get_schedules_for_user, Schedule, delete_all_schedules_from_user
 from datetime import datetime, timedelta, date
 from collections import defaultdict
 from copy import deepcopy
@@ -31,7 +31,7 @@ logger = logging.getLogger("bot")
 
 def start(update: Update, context: CallbackContext) -> None:
     update.message.reply_text('''
-    Olá, eu sou o RU UFPR Bot, o robô de <a href="https://gitlab.c3sl.ufpr.br/caad/ru-bot-telegram">código aberto</a> mantido pelo <a href="https://caad.inf.ufpr.br/">CAAD (Centro Acadêmico Alexandre Direne)</a> que te mostra o cardápio do Restaurante Universitário da UFPR! Aqui vão os meus comandos:
+    Olá, eu sou o RU UFPR Bot, o robô de <a href="https://gitlab.c3sl.ufpr.br/caad/ru-bot-telegram">código aberto licenciado sob AGPL</a> mantido pelo <a href="https://caad.inf.ufpr.br/">CAAD (Centro Acadêmico Alexandre Direne)</a> que te mostra o cardápio do Restaurante Universitário da UFPR! Aqui vão os meus comandos:
 
     - /agendar · Configura notificações de cardápio
     - /cardapio_central · Mostra o cardápio do RU Central
@@ -184,7 +184,7 @@ def agendar_antes_abertura(update: Update, context: CallbackContext) -> None:
                 time = TIME_BEFORE_OPENING_BY_MEAL[meal]
                 schedule = Schedule(time=time, day_week=day_week, location=data.location, meal=meal, user_id=update.effective_user.id, created_at=datetime.now())
                 logger.info(f"User {update.effective_user.id} {update.effective_user.first_name} {update.effective_user.last_name} {update.effective_user.username} added schedule {pformat(schedule)}")
-                insert_schedule(schedule)
+                upsert_schedule(schedule)
         body, keyboard = agendar(update.effective_user.id)
         update.callback_query.message.edit_text(body, reply_markup=keyboard, parse_mode=PARSEMODE_HTML)
         return
@@ -245,8 +245,12 @@ def remover_todas_notificacoes_ok(update: Update, context: CallbackContext) -> N
     update.callback_query.message.edit_text(body, reply_markup=keyboard, parse_mode=PARSEMODE_HTML)
     logger.info(f"User {update.effective_user.id} {update.effective_user.first_name} {update.effective_user.last_name} {update.effective_user.username} removed all notifications")
 
+def invalid_button(update: Update, context: CallbackContext) -> None:
+    update.callback_query.answer(text="Essa mensagem não é mais válida", show_alert=True)
+
 def send_scheduled(context: CallbackContext) -> None:
     time = context.job.next_t - timedelta(minutes=EVERY_X_MINUTES)
+    logging.info(f"Getting schedules matching {time}")
     schedules = get_schedules_matching_time(time)
     for schedule in schedules:
         days, update_time = get_menus_by_days(schedule.location)
@@ -281,6 +285,7 @@ def main() -> None:
     updater.dispatcher.add_handler(CallbackQueryHandler(remover_todas_notificacoes_ok, pattern=RemoveTodasNotificacoesOk))
     updater.dispatcher.add_handler(CallbackQueryHandler(agendar_callback, pattern=Agendar))
     updater.dispatcher.add_handler(CallbackQueryHandler(agendar_antes_abertura, pattern=AgendarAntesAbertura))
+    updater.dispatcher.add_handler(CallbackQueryHandler(invalid_button, pattern=InvalidCallbackData))
     tm = datetime.now()
     tm = tm - timedelta(minutes=tm.minute % EVERY_X_MINUTES, seconds=tm.second, microseconds=tm.microsecond)
     tm = tm + timedelta(minutes=EVERY_X_MINUTES)