Самая простая команда - /test, она просто отправляет жестко закодированный текст обратно. Реализовать довольно просто:

func (c context) test() {
    c.bot.Send(tgbotapi.NewMessage(c.message.Chat.ID, "It works"))
}

/ экспорт

Экспорт - очень важная команда. Считаю это настолько важным, что реализовал первым. Он позволяет пользователю загружать все свои данные, хранящиеся в базе данных бота. Скажите нет привязке к поставщику.

В наши дни это действительно раздражает. Возьмите любое приложение, например, приложение для фитнес-трекера. Он отслеживает ваши пробежки и хранит ваши данные где-нибудь на телефоне или в облаке. И однажды оно перестает работать или вы решаете начать использовать другое приложение. И что ты делаешь? Как вы переносите свои данные? Обычно нет простого пути или вообще нет. Вам придется отказаться от всей своей истории и прогресса и начать заново в новом приложении.

Я не хочу этого для моих еще несуществующих пользователей. Позвольте им забрать свои данные домой, когда захотят. Вот почему у меня есть команда /export. Просто скажите /export боту, и он с радостью выполнит:

Для создания файла CSV я использую встроенный пакет encoding/csv. Экспортировать все строки в файл CSV очень просто:

buffer := &bytes.Buffer{}
csv := csv.NewWriter(buffer)

// For each row
for ... {
    csv.Write([]string{name, date})
}

// Flush when done (important!)
csv.Flush()

// Send
c.bot.Send(tgbotapi.NewDocumentUpload(
    c.message.Chat.ID,
    tgbotapi.FileBytes{
        Name:  "data.csv",
        Bytes: buffer.Bytes()}))

/ добавить и / поскольку

Команды /add и /since - это хлеб с маслом этого бота. Как следует из названий, один предназначен для добавления событий, а другой - для проверки того, когда событие было добавлено в последний раз. /add - это команда 2-в-1, как шампунь и кондиционер в одном флаконе, она отображает время перед добавлением.

/верхняя

Чтобы попрактиковаться в SQL, я добавил относительно бесполезную команду для отображения 10 наиболее регистрируемых событий.

SELECT name, COUNT(name) freq FROM events
    WHERE user = <user-id>
    GROUP BY name
    ORDER BY freq DESC
    LIMIT 10

В моем действительно тупом наборе данных это выглядит так:

Должен сказать, что пока я очень впечатлен SQL. Теоретически я знал, на что он способен. Но теперь я могу попробовать это, и это действительно здорово, как я могу просто написать простой запрос вместо того, чтобы писать кучу кода с циклами и переменными. Наверное, и более эффективно.

Что дальше

Бот становится умнее. Теперь он мог по-разному реагировать на несколько основных команд. Приближается еще больше. Я бы хотел, чтобы бот мог рисовать диаграммы и показывать некоторую статистику, например, как часто что-то происходило или распределение в течение дня / недели / месяца. Есть ли у у какие-нибудь идеи?

Если вам интересно, код доступен на GitHub. Эта версия помечена тегом day-5.

Первоначально опубликовано на detunized.net 9 апреля 2019 г.