Spaces:
Sleeping
Sleeping
| /** | |
| * Create a mini app button that works in BOTH groups and private chats. | |
| * | |
| * - Private chat: use KeyboardButtonWebView (inline, gives initData) | |
| * - Group chat: use KeyboardButtonUrl with t.me/bot?startapp=param link | |
| * (KeyboardButtonWebView throws BUTTON_TYPE_INVALID in groups) | |
| */ | |
| const { Api } = require("telegram"); | |
| function getBotUsername() { | |
| // Extract from BOT_TOKEN or use env | |
| return process.env.BOT_USERNAME || 'Alexagamebot'; | |
| } | |
| function getWebAppUrl() { | |
| return process.env.WEBAPP_HTTPS_URL || 'https://huggingface.co/spaces/alexaincsl/alexagame'; | |
| } | |
| /** | |
| * Build inline markup with a mini app button. | |
| * @param {string} text - Button label | |
| * @param {string} startAppParam - The ?startapp= parameter (e.g. 'daily', 'mission', 'carrom_gameId') | |
| * @param {boolean} isGroup - Whether the chat is a group | |
| */ | |
| function miniAppButton(text, startAppParam, isGroup) { | |
| if (isGroup) { | |
| // Group: use URL button with t.me deep link | |
| const url = `https://t.me/${getBotUsername()}?startapp=${startAppParam}`; | |
| return new Api.ReplyInlineMarkup({ | |
| rows: [new Api.KeyboardButtonRow({ | |
| buttons: [new Api.KeyboardButtonUrl({ text, url })] | |
| })] | |
| }); | |
| } else { | |
| // Private: use WebView button (gives initData) | |
| const url = getWebAppUrl() + '?type=' + startAppParam; | |
| return new Api.ReplyInlineMarkup({ | |
| rows: [new Api.KeyboardButtonRow({ | |
| buttons: [new Api.KeyboardButtonWebView({ text, url })] | |
| })] | |
| }); | |
| } | |
| } | |
| /** | |
| * Check if chat is a group/supergroup | |
| */ | |
| function isGroupChat(chatId) { | |
| const id = chatId.toString(); | |
| return id.startsWith('-'); | |
| } | |
| module.exports = { miniAppButton, isGroupChat, getBotUsername, getWebAppUrl }; | |