bot — переиспользуемый core-пакет для новых ботов.
Он содержит рантайм, системные команды, SQLite, integrations, payments и базовые сервисы.
Готовый стартовый проект поверх него лежит в example.
Run(ctx, opts...)— запуск ботаWithCommands(...)— подключение своих регистраторов командWithPaymentProducts(...)— каталог товаров для платежейWithStartupHooks(...)— startup hooks для своей инициализацииWithPaymentSuccessHooks(...)— hook-и после успешного начисления по оплатеWithReferralSuccessHooks(...)— hook-и после успешной новой referral-привязкиWithHelpInfo(...)— кастомный информационный блок для/help
Также наружу экспортированы типы и helper-ы для команд:
BotDependenciesReply,Send,CurrentUpdateImageBytesFromUpdate,ImageBytesFromAttachmentIsSubscribedToChannelNewDialog,WithValidator,IntRangeBtn,URLBtn,Row,WithButtonsImage,Video,Audio,File,WithMedia
- системные команды из
system/ - рантайм платформ
tgиmax - локальные adapters
internal/bot/adapters/tgиinternal/bot/adapters/max - SQLite store и migrations
- posts, mandatory, track, referrals, stats, broadcasts
- автопродолжение системных рассылок после рестарта
- досрочная остановка активной рассылки через
/broadcast_stop <id> - tasks с каналами и наградами
- payments и Platega callback
- integrations: Aimini, DeepSeek, Gemini, TG, MAX
- TG helpers:
getFile,getChatMember, download byfile_id
DeepSeek включается не токеном из env, а feature-флагом:
FEATURE_DEEPSEEK=trueDEEPSEEK_PROXY_URL=http://host:portпри необходимости отдельного proxy только для DeepSeek
После включения токены добавляются уже из самого бота через админские команды. Токены хранятся в SQLite и кешируются на 1 минуту.
Gemini включается не токеном из env, а feature-флагом:
FEATURE_GEMINI=trueGEMINI_PROXY_URL=http://host:portпри необходимости отдельного proxy только для Gemini
После включения токены добавляются уже из самого бота через админские команды. Токены хранятся в SQLite и кешируются на 1 минуту.
Aimini включается не токеном из env, а feature-флагом:
FEATURE_AIMINI=trueAIMINI_BASE_URL=https://...AIMINI_NODE_ID=...AIMINI_PROXY_URL=http://host:portпри необходимости отдельного proxy только для Aimini
После включения токены добавляются уже из самого бота через админские команды. Токены хранятся в SQLite и кешируются на 1 минуту.
Пример из main.go:
corebot.Run(
ctx,
corebot.WithPaymentProducts(
payments.MustCoinProduct("10_coins", "10 монет", 100),
),
corebot.WithPaymentSuccessHooks(onPaymentSuccess),
corebot.WithReferralSuccessHooks(onReferralSuccess),
corebot.WithCommands(commands.Register),
)Регистратор команд выглядит так:
func Register(b *corebot.Bot, deps corebot.Dependencies) {
b.Event("ping", func(ctx context.Context, _ ...string) error {
return corebot.Reply(ctx, "pong")
})
}Пример бизнес-hook после оплаты:
func onPaymentSuccess(ctx context.Context, b *corebot.Bot, deps corebot.Dependencies, tx corebot.PaymentTransaction) error {
return corebot.Send(ctx, b, tx.PlatformUserID, "Оплата прошла успешно")
}Пример бизнес-hook после referral:
func onReferralSuccess(ctx context.Context, b *corebot.Bot, deps corebot.Dependencies, event corebot.ReferralSuccess) error {
if event.GrantedCoins <= 0 {
return nil
}
return corebot.Send(ctx, b, event.InviterUserID, "За приглашение начислены монеты")
}Пример получения bytes входящего фото:
upd, _ := corebot.CurrentUpdate(ctx)
photo, mimeType, err := corebot.ImageBytesFromUpdate(ctx, deps, upd)
_ = photo
_ = mimeType
_ = errПример общей проверки подписки:
ok, err := corebot.IsSubscribedToChannel(ctx, deps, upd.Platform, upd.UserID, channelID)
_ = ok
_ = errВажно для /start:
- core не отправляет никакого стартового текста сам
- core только обрабатывает системную часть
/start: регистрацию пользователя,ref_*,trk_*, метрику start - весь пользовательский ответ на
/startдолжен регистрироваться в бизнес-боте черезb.Event("start", ...)
Core читает env только через github.com/elum-utils/env.
Формат и список переменных смотри в .env.example.
Основные группы:
CommonAdminsTelegramMAXDeepSeekGeminiAiminiPayments
Отдельные proxy задаются только для AI-интеграций и не влияют на Telegram, MAX или Payments:
DEEPSEEK_PROXY_URLGEMINI_PROXY_URLAIMINI_PROXY_URL
Для MAX дополнительно можно управлять общим HTTP timeout:
MAX_HTTP_TIMEOUT_SEC=120
Это влияет в том числе на upload медиа в MAX и полезно для больших сгенерированных изображений.
Если новому боту нужна своя инициализация на старте, используй WithStartupHooks(...).
Это удобное место для:
- создания своих таблиц
- проверки внешних сервисов
- инициализации доменных зависимостей
Если боту нужен task-flow, core уже содержит общие команды:
/task_create/task_edit <id>/task_list/earn_more/task_done <id>
Task-проверка подписок уже работает для tg и max, а свой mandatory/onboarding flow можно строить отдельно поверх этих базовых методов.
Если нужна новая общая функциональность для всех будущих ботов, добавляй ее в bot, а не в example.