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 #1

Updated by Gregory Magarshak 9 months ago

  • Description updated (diff)
Actions #2

Updated by Gregory Magarshak 9 months ago

  • Description updated (diff)
Actions #3

Updated by Gregory Magarshak 9 months ago

  • Description updated (diff)
Actions #4

Updated by Gregory Magarshak 9 months ago

  • Description updated (diff)
Actions #5

Updated by Gregory Magarshak 9 months ago

  • Description updated (diff)
Actions #6

Updated by Gregory Magarshak 9 months ago

  • Description updated (diff)
Actions #7

Updated by Gregory Magarshak 9 months ago

  • Description updated (diff)
Actions #8

Updated by Gregory Magarshak 9 months ago

  • Description updated (diff)
Actions #9

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.

https://core.telegram.org/bots/api#inlinequeryresult

Actions #10

Updated by Gregory Magarshak 9 months ago

  • Description updated (diff)
Actions

Also available in: Atom PDF