Feature #3147
openHomework for Lesson 1: Try methods like sendVideo, etc.
0%
Description
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
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:
While Andrey works on this, you can IMPLEMENT and practice calling other methods, including:
Telegram_Bot::sendMessage($params)
with parameterreply_markup
containing aForceReply
structureTelegram_Bot::sendMessage()
with inline keyboards, which you can adapt from the code here: https://issues.qbix.com/projects/telegram/wiki/Lesson_1_CodeTelegram_Bot::sendMessage()
with reply keyboards- I recommend creating three static methods
Telegram_Bot::forceReply($forceReply, $inputFieldPlaceholder = null, $selective = false)
Telegram_Bot::replyKeyboard()
andTelegram_Bot::inlineKeyboard()
methods and again, copypaste the documentation into ChatGPT to spit out the YUIDoc. These methods should return anarray()
of arrays, that can be json-encoded, and passed to parameters insidesendMessage
. - Implement
Telegram_Bot::answerCallbackQuery()
function with the chatgpt-generated copypaste from the docs here $result = Telegram_Bot::sendVideo()
andsendAudio
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 arehttps://intercoin.app/Q/uploads/...
After Andrey implements the above framework, please help him test the above 3 events, using the code you wrote.
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:
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
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()`.
Files