Да будет Хабр снова торт! Да придут на него статьи о программировании! И да пребудут на нем всегда технические обсуждения. А теперь к делу... Каждый самостоятельно развивающийся программист, рано или поздно сталкивается с тем, что ему нужна облачная база данных для своего проекта. Между тем, ваш проект может быть не денег ради, а души для, друзей, знакомых, небольшой аудитории, и посему платить деньги за настоящее взрослое облачное хранилище данных жалко. Предлагаю вам очень простое в подключении, многократно проверенное мной лично, стабильное и весьма изящное решение этого вопроса. Подойдет, если вы программируете на Kotlin.
Идея между тем хакерски проста. Опишу ее, лишь для того чтобы объяснить, самостоятельно воспроизводить все эти шаги вам не придется, благодаря разработанной светлыми умами коммьюнити библиотеке. Если вам хочется поскорее попробовать ее, то пропустите следующие объяснения, и сразу переходите в раздел "Как подключить". Итак, концепт
-
Создаем словарь в куче, с мапингом из произвольного ключа в идентификатор telegram-файла, Map<K, FileId>
-
Для сохранения произвольной сущности по ключу, сохраняем в словарь ее ключ, а вместо значения кладем идентификатор сериализованного в CBOR файла, сохраненного в telegram-канал.
-
Для получения любой сущности по ключу, проделываем обратное, получаем ее идентификатор, и десериализуем CBOR из telegram.
-
Все это можно обернуть в красивый generic, по образцу стандартного Map<K, V>, что и делает разработанная умными людьми библиотека.
-
У внимательного читателя ранее уже возник вопрос, а где хранится само состояние мапинга из ключей, в идентификаторы? В... telegram-файле в CBOR. Идентификатор нашего keystore в свою очередь пишется прямо в описание канала. При перезапусках, библиотека читает один единственный идентификатор из канала, и загружает в память мапинг.
-
Таким образом, вы можете хранить десятки гигабайт в вашем облачном хранилище, с доступом по ключу совершенно не нагружая кучу.
Как подключить?
Вы можете использовать Maven или Gradle. Библиотека залита в репозиторий jitpack. Разберем как это будет выглядеть для Gradle в build.gradle.kts
repositories {
// ...
// ...
// Добавляем репозиторий jitpack
maven("https://jitpack.io")
}
plugins {
// ...
// ...
// Добавляем плагин компилятора для сериализации
kotlin("plugin.serialization") version "2.1.20-Beta2"
}
dependencies {
// ...
// ...
// Добавляем библиотеку
implementation("com.github.demidko:telegram-storage:2025.02.15)
}
Пример использования в коде (Kotlin)
import com.github.demidko.telegram.TelegramStorage.Constructors.TelegramStorage
// Делаем вашу сущность сериализуемой,
// именно для этого и нужен был плагин компилятора
@Serializable
data class Person(val name: String, val address: String)
fun main() {
val token = "Ваш токен бота Telegram"
val channel = "Ваше @название канала в телеграм" // или ID (long)
val storage = TelegramStorage<String, Person>(token, channel)
// Сохраняем сущность в канал
storage["Special Government Employee"] = Person("Elon Musk", "Texas")
// Восстановленная Person("Elon Musk", "Texas") из канала
val p = storage["Special Government Employee"]!!
}
Важные предупреждения
Как видите, все очень просто. Само собой разумеется, но не забывайте, что ваш бот также должен быть администратором в вашем канале, чтобы проделывать подобное. Библиотека строго типизирована. Если вы выбрали типы данных, то при следующем запуске поменять ключ/значение не получится без обнуления всего хранилища. Не меняйте описание канала сгенерированное ботом — это приведет к обнулению облачного хранилища. Разумно использовать отдельный закрытый канал, получая доступ по ID. Так никто извне не сможет посмотреть данные вашего хранилища. Telegram накладывает некоторые ограничения на ботов. В связи с этим не рекомендуется чтобы размер одного отдельного значения превышал 20 мб.
Исходный код
Оригинальный репозиторий библиотеки находится на GitHub: demidko/telegram-storage
Автор позиционирует библиотеку как
A free NoSQL cloud database in your Telegram channel
Не ленитесь, поставьте звездочку доброму человеку, он для всех старался бесплатно.
Автор: manul