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
Updated by Gregory Magarshak 9 months ago
andrey @artem please finish this issue by successfully implementing and testing @sendVideo
with URL, file upload and using existing file. Do not wait for an update, send videos to chats by hitting test.php yourself
Then please handle this type of update and replying with inline query results.