# davtelepot
This project conveniently mirrors the Telegram bot API with the class `Bot`.
Please note that Python3.5+ is needed to run async code.
Check requirements.txt for third party dependencies.
Check out `help(Bot)` for detailed information.
## Project folders
### `davtelepot/data` folder
* `config.py` contains configuration settings (e.g. certificate path, local_host, port etc.)
* `passwords.py` contains secret information to be git-ignored (e.g. bot tokens)
* `*.db` files are SQLite databases used by bots
* `*.log`: log files (store log_file_name and errors_file_name in `data/config.py` module)
### `examples` folder
This folder contains full-commented and ready-to-run examples for simple davtelepot.bot Telegram bots.
## Usage
```
import sys
from davtelepot.bot import Bot
from data.passwords import my_token, my_other_token
long_polling_bot = Bot(token=my_token, database_url='my_db')
webhook_bot = Bot(token=my_other_token, hostname='example.com',
certificate='path/to/certificate.pem',
database_url='my_other_db')
@long_polling_bot.command('/foo')
async def foo_command(bot, update, user_record):
return "Bar!"
@webhook_bot.command('/bar')
async def bar_command(bot, update, user_record):
return "Foo!"
exit_state = Bot.run(
local_host='127.0.0.5',
port=8552
)
sys.exit(exit_state)
```
Check out `help(Bot)` for detailed information.
## Webhook additional information
To run a bot in webhook modality, you have to provide a `hostname` and `certificate` at bot instantiation and a `local_host` and `port` when calling `Bot.run` method.
* Telegram will send POST requests at `https://{hostname}/webhook/{tokens}/` using `certificate` for encryption
* `aiohttp.web.Application` server will listen on `http://{local_host}:{port}` for updates
It is therefore required a reverse proxy passing incoming requests to local_host.
**Example of nginx reverse proxy serving this purpose**
```nginx
server {
listen 8553 ssl;
listen [::]:8553 ssl;
server_name example.com www.example.com;
location /telegram/ {
proxy_pass http://127.0.0.5:8552/;
}
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
}
```
**Example of python configuration file in this situation**
```python
# File data/config.py, gitignored and imported in main script
hostname = "https://www.example.com:8553/telegram"
certificate = "/path/to/fullchain.pem"
local_host = "127.0.0.5"
port = 8552
# Main script
from data.config import hostname, certificate, local_host, port
from data.passwords import bot_token
from davtelepot.bot import Bot
my_bot = Bot(
token=bot_token,
hostname=hostname,
certificate=certificate
)
# ...
Bot.run(
local_host=local_host,
port=port
)
```