---
title: v3.0.0
---
## What's Changed
- The classes Client, Message, Chat and User now inherit from their respective classes in Pyrogram. This mean you can use them as if they were the original classes from Pyrogram. This is super useful for the IDEs to provide code completion and type checking of the pyromod features.
![image](https://github.com/usernein/pyromod/assets/29507335/e5754ceb-6264-41a4-baa2-53f7537e0833)

- Since we can now use pyromod's Client just like the original Client, there is a new way of initilizing pyromod. Before, you needed to import pyromod anywhere in your code before importing pyrogram. Now you can simply import Client from pyromod instead of pyrogram and you are good to go.
![image](https://github.com/usernein/pyromod/assets/29507335/9d1cde0c-2b85-497d-bc1c-5be4336b2067)

- The tuple identifiers that divided opinions have been removed. Now you can specify the data directly to the listen and ask methods as keyword arguments. Thanks for the suggestion, @Eikosa! (#12)
![image](https://github.com/usernein/pyromod/assets/29507335/1a3eda3b-42be-4685-8a79-74a773f882d5)

- Added support for inline_message_id in the listen and ask methods.
- pyromod will now check if the CallbackQuery.chat exists before trying to get its id, since chat will be null on inline messages.
- The order of the arguments of Client.ask has been changed. Now the first argument is the chat_id and the second is the text to send, following the same order as Client.send_message.
![image](https://github.com/usernein/pyromod/assets/29507335/e48953e3-859a-4ae7-9598-bf185cf583b5)

- The internal login of listeners got a lot more simple and robust. It has been hugely refactored and now it's a lot easier to understand and maintain.
- The internal logic of the listeners state has been refactored. Now it uses Listener objects instead of a bunch of positional variables and dicts.
- The whole code got type hints. This means that the IDEs can now provide code completion and type checking of the pyromod features.
![image](https://github.com/usernein/pyromod/assets/29507335/c32426ab-a7ce-4646-a127-5f6254ccf8c9)

- The decorators patch and patchable have been renamed to patch_into and should_patch respectively, making them more descriptive.
- @Jusidama-Bot made a huge contribution to the project, making the monkeypatching utils so much more powerful. Awesome!

- The classes Client, Chat, User, Message, MessageHandler and CallbackQueryHAndler, that were previously in the listen.py file were split into their own files into the listen subpackage.
![image](https://github.com/usernein/pyromod/assets/29507335/13465830-f285-41be-8e00-1b909a418f8c)

- The classes ListenerStopped and ListenerTimeout, that were previously in the listen.py file were moved to the exceptions subpackage.
![image](https://github.com/usernein/pyromod/assets/29507335/daecbcc0-eec7-47df-bdc0-1504cf05f0a0)

- The class PyrogramConfig, that was previously in the utils.py file was moved to the config subpackage. It's now called config and it's a SimpleNamespace object instead of a class.
![image](https://github.com/usernein/pyromod/assets/29507335/eec3fd03-effe-4671-835f-90710072e9c2)

- The enum ListenerTypes, that was previously in the listen.py file was moved to the brand new types subpackage.
![image](https://github.com/usernein/pyromod/assets/29507335/018ba927-9ec3-49ef-8f47-c605e5355e68)

- Now the ask method will only send a message if the specified text is not empty. Thanks for that, @Eikosa!
![image](https://github.com/usernein/pyromod/assets/29507335/788aaf38-332a-476b-b529-b27ac47208b1)

- The attribute request of the Message object returned by the ask method has been renamed to sent_message, much more descriptive. Thanks again, @Eikosa!
![image](https://github.com/usernein/pyromod/assets/29507335/42f352fa-dc04-4071-8eda-7e7d25b0d945)

- @tofikdn has added support for Message.message_id, when available, like in Pyrogram v1. Thanks for that!
- The project structure has been completely refactored. Now it's more organized and a lot easier to maintain.
```yaml
pyromod/
├── __init__.py
├── helpers
│  ├── helpers.py
│  └── __init__.py
├── listen
│  ├── __init__.py
│  └── listen.py (used to contain Client, Message, Chat, User, MessageHandler, CallbackQueryHandler, ListenerStopped, ListenerTimeout and ListenerTypes)
├── nav
│  ├── __init__.py
│  └── pagination.py
└── utils
    ├── __init__.py
    └── utils.py (used to contain PyromodConfig and the functions patch and patchable)
```

Now it has the following structure:
```yaml
pyromod/
├── __init__.py
├── config
│  └── __init__.py (contains the config object, formerly PyrogramConfig)
├── exceptions
│  ├── __init__.py
│  ├── listener_stopped.py
│  └── listener_timeout.py
├── helpers
│  ├── __init__.py
│  └── helpers.py
├── listen
│  ├── __init__.py
│  ├── callback_query_handler.py
│  ├── chat.py
│  ├── client.py
│  ├── message_handler.py
│  ├── message.py
│  └── user.py
├── nav
│  ├── __init__.py
│  └── pagination.py
├── types
│  ├── __init__.py
│  ├── identifier.py
│  ├── listener.py
│  └── listener_types.py
└── utils
    ├── __init__.py
    └── patch.py (now contains the functions patch_into and should_patch)
```
- Now pyromod has documentation! You can access it at https://pyromod.pauxis.dev


## New Contributors
* @tofikdn made their first contribution in https://github.com/usernein/pyromod/pull/11
* @Eikosa made their first contribution in https://github.com/usernein/pyromod/pull/13
* @Jusidama-Bot made their first contribution in https://github.com/usernein/pyromod/pull/17

**Full Changelog**: https://github.com/usernein/pyromod/compare/v2.1.0...v3.0.0