Project

General

Profile

Actions

Feature #3147

open

Homework for Lesson 1: Try methods like sendVideo, etc.

Added by Gregory Magarshak 9 months ago. Updated 9 months ago.

Status:
New
Priority:
High
Start date:
08/28/2024
Due date:
08/29/2024 (about 9 months late)
% Done:

0%

Estimated time:
4.00 h

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 parameter reply_markup containing a ForceReply structure
  • 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
  • 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
  • $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.

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()`.

video: https://intercoin.app/Q/uploads/Media/recordings/meeting4/1687277257912/oummmsdv/1687278156391/1687278325846.mp4


Files

clipboard-202408280257-nfd6r.png (312 KB) clipboard-202408280257-nfd6r.png Gregory Magarshak, 08/28/2024 06:57 AM
Actions

Also available in: Atom PDF