php-telegram-bot / core

PHP Telegram Bot based on the official Telegram Bot API
MIT License
3.81k stars 953 forks source link

Unable to add a command that handles web_app_data #1423

Open mlocati opened 8 months ago

mlocati commented 8 months ago

🐞 Bug Report

Required Information

? !
Operating system n/a
PHP Telegram Bot version 0.81.0
PHP version n/a
MySQL version n/a
Update Method Webhook
Self-signed certificate no

RAW update (if available)

{
    "update_id": 111111111,
    "message": {
        "message_id": 222,
        "from": {
            "id": 2222222,
            "is_bot": false,
            "first_name": "FirstName",
            "last_name": "LastName",
            "username": "UserName",
            "language_code": "it"
        },
        "chat": {
            "id": 2222222,
            "first_name": "FirstName",
            "last_name": "LastName",
            "username": "UserName",
            "type": "private"
        },
        "date": 1698068479,
        "web_app_data": {
            "button_text": "Text of button used to launch the Web App",
            "data": "data receieved from the Web App"
        }
    }
}

Summary

We can launch Web Apps by using the web_app key in Keyboard or InlineKeyboard reply markups.

Web Apps can send some data back to the bot (see the JSON above).

The problem is that (AFAIK) there's no way to create a command that handles it.

Because neither web_app_data nor webappdata are the same as Webappdata,we can't create a command that handles the update.

noplanman commented 8 months ago

I've not looked deeply into this yet, but since that data gets passed via a message, you should be able to get it inside your GenericmessageCommand class. Have you tried this?

class GenericmessageCommand extends SystemCommand
{
    public function execute(): ServerResponse
    {
        $data = $this->getMessage()?->getWebAppData()?->getData();

        // check if $data isn't null and do something with it.
    }
}
mlocati commented 8 months ago

That's what I'm doing right now.

But I think the code has an issue (not only for Web Apps.

If $type is not 'command', this line makes it so $command_tmp always contains a string with the first character in upper case, and all the other characters in lowercase (for example: 'web_app_data''Webappdata').

But this line makes it so all the command handlers have a snake_case syntax (for example: 'WebAppDataCommand''web_app_data').

That way, when $type !== 'command', we'll NEVER have a match between command names derived from messages and command classes here.

noplanman commented 1 month ago

@mlocati I feel bad for not having had replied earlier and looked into this more, just didn't have the time. :confused:

We're trying to get fresh energy into the project and I trust this will be picked up then, as well as a bunch of other things too!