Project

General

Profile

Feature #3147

Updated by Gregory Magarshak 9 months ago

Please read this: https://issues.qbix.com/projects/telegram/wiki/Wiki 

 This is the homework I gave to Andrey: https://issues.qbix.com/issues/3146 

 At the end of this homework, he will have implemented a simple Telegram plugin inside Qbix, that will handle updates. 

 Telegram bots / apps will be handled similarly to "web3" or "facebook" platform apps. The xid of a user is their userId on telegram. The appId of a bot might just be its username (because it's pretty constant, unlike a user's ID). 

 The Telegram plugin adds a hook to installer script which will call @setWebhook@ for each app inside "Users/apps/telegram/..." config. 

 The endpoint that will be hit will be @{{baseUrl}}/telegram.php@, similar to @{{baseUrl}}/index.php@ and will call @Telegram_Dispatcher::dispatch($update)@ similar to @Q_Dispatcher::dispatch($uri)@  

 so that you can implement event handlers in PHP for events such as: 

 * @Telegram/update/$PluginOrApp/message@ 
 * @Telegram/update/$PluginOrApp/edited_message@ 
 * @Telegram/update/$PluginOrApp/callback_query@ 


 h2. What to do 

 Please clone https://repo.qbix.com/plugin/Telegram into @Q/platform/plugins/Telegram@ and add the usual folders like @handlers@ and @classes@. Make @classes/Telegram/Bot.php@ class and implement a bunch of static methods like @sendMessage(array $params)@ and @sendVideo(array $params)@. Document them with YUIDoc how I usually do elsewhere, by copying the documentation from https://core.telegram.org/bots/api#sendmessage . Feel free to copypaste this html into ChatGPT with a line on top instructing it to spit out the docs: 

 !clipboard-202408280257-nfd6r.png! 

 While Andrey works on this, you can practice calling other methods, including: 

 * @Telegram_Bot::sendMessage($params)@ with parameter "@reply_markup@":https://core.telegram.org/bots/api#sendmessage @reply_markup@ containing a "@ForceReply@ structure":https://core.telegram.org/bots/api#forcereply 
 * @Telegram_Bot::sendMessage()@ with inline keyboards, which you can adapt from the code here: https://issues.qbix.com/projects/telegram/wiki/Lesson_1_Code 
 * @Telegram_Bot::sendMessage()@ with "reply keyboards":https://core.telegram.org/bots/api#replykeyboardmarkup 
 * I recommend creating three static methods @Telegram_Bot::forceReply($forceReply, $inputFieldPlaceholder = null, $selective = false)@ @Telegram_Bot::replyKeyboard()@ and @Telegram_Bot::inlineKeyboard()@ methods and again, copypaste the documentation into ChatGPT to spit out the YUIDoc. These methods should return an @array()@ of arrays, that can be json-encoded, and passed to parameters inside @sendMessage@. 
 * Implement @Telegram_Bot::answerCallbackQuery()@ function with the chatgpt-generated copypaste "from the docs here":https://core.telegram.org/bots/api#replykeyboardmarkup 
 * @$result = Telegram_Bot::sendVideo()@ and @sendAudio@ with actual mp4 and mp3 files on the web. You can find some on our own server under @/live/ITR/web/Q/uploads/...@ and their URLs are @https://intercoin.app/Q/uploads/...@ 

 After Andrey implements the above framework, please help him test the above 3 events, using the code you wrote. 

 h2. Already uploaded files to Telegram 

 Practice creating a Qbix installer file like this: @plugins/Telegram/scripts/Telegram/0.1-Telegram.mysql@ which will create a table: 

 <pre> 
 CREATE TABLE {{prefix}}file 
 url VARCHAR(255) COMMENT "the url of the original file" 
 id VARCHAR(255) COMMENT "the id of the uploaded file on telegram", 
 ADD INDEX ('id') // not unique index 
 ADD INDEX ('url') // not unique index 
 </pre> 

 Run this installer, and then call `scripts/Q/models.php --plugin Telegram` to generate the models in the `Telegram/classes` folder. All the files along with the code files you wrote, to version control, to be checked in. 

 Store the URLs in this table, in a format like literal strings: "{{Users}}/foo/bar.mp4" or "{{baseUrl}}/foo/bar.mp4" and not "https://hardcoded.url.here/foo/bar.mp4" so the app can be migrated to other domains. 

 When you @sendVideo()@ you should first check if the file `url` already exists (replacing @Q_Request::baseUrl()@ with '{{baseUrl}}' before calling `Telegram_File::select()->where(compact('url'))`) . If it exists, then use the file id. Otherwise, use the URL, but if the method indicates success, then save the new row with `Telegram_File::insert()` or better yet: `(new Telegram_File($params))->save()`.

Back