Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TelegramInlineQueryDriver [feature discussion] #94

Open
vdomah opened this issue Oct 16, 2020 · 0 comments
Open

TelegramInlineQueryDriver [feature discussion] #94

vdomah opened this issue Oct 16, 2020 · 0 comments

Comments

@vdomah
Copy link
Contributor

vdomah commented Oct 16, 2020

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?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant