driver-telegram icon indicating copy to clipboard operation
driver-telegram copied to clipboard

TelegramInlineQueryDriver [feature discussion]

Open vdomah opened this issue 5 years ago • 0 comments

I successfully implemented Inline Queries Driver in my project and I would like to make PR to this repo but I need some advices about how to do it properly to meet the package requirements.

So the steps are:

  1. To create TelegramInlineQueryDriver class [DONE]
  2. Write matching logic [DONE]
public function matchesRequest()
    {
        return ! is_null($this->payload->get('inline_query'));
    }
  1. Check that other driver will not match inline_query (TelegramDriver itself)

  2. Here is the interesting part. Need to decide how TelegramInlineQueryDriver sends request to Telegram API. Because inline queries don't use Conversations/Messages - we just need to send response directly.

  3. In my project I've created buildServicePayloadInline instead of buildServicePayload method in TelegramInlineQueryDriver. buildServicePayloadInline will switch to answerInlineQuery endpoint:

$this->endpoint = 'answerInlineQuery';
  1. There I was sending request with data needed:
$data = ['inline_query_id' => $inline_query_id, 'cache_time' => 0];
//forming $arArticlesJson array
$data['results'] = '[' . implode(',', $arArticlesJson) . ']';

return $data;
  1. $arArticlesJson is array of InlineQueryResultArticle objects https://core.telegram.org/bots/api#inlinequeryresultarticle.

So now I'm wondering the most about "//forming $arArticlesJson array" part. We don't have Conversation classes here. But we need to inject our logic to prepare data that will be sent.

The most primitive way I see is for example to do that just by static method with closure:

DriverManager::loadDriver(TelegramInlineQueryDriver::class);

TelegramInlineQueryDriver::listen(function($inline_query) {
    //developer got access to all inline query parameters:
    //$inline_query['from']['id'];
    //$inline_query['id'];
    //$inline_query['query']; - the string user enters writing @bot_name <query>

    $data = ['inline_query_id' => $inline_query_id, 'cache_time' => 0];
    //forming $arArticlesJson array
    $data['results'] = '[' . implode(',', $arArticlesJson) . ']';

    return $data;
});

What are your ideas on this, dear colleagues?

vdomah avatar Oct 16 '20 14:10 vdomah