from setuptools import setup, find_packages

setup(
    name='EasyGram',
    version='0.0.3-beta.1',
    description='Библиотека для удобного и многофункционального(в будущем) использования.',
    long_description="""
Установить:
```bash
pip install EasyGram
```

## Быстрый старт

#### Эхо бот(синхронный)
```python
from EasyGram import SyncBot, types

bot = SyncBot('Token here')

@bot.message(content_types='text')
def echo_bot(message: types.Message):
	message.answer(message.text)

bot.polling()
```

#### Эхо бот(асинхронный)
```python
from EasyGram.Async import AsyncBot, types

bot = AsyncBot('Token here')

@bot.message(content_types='text')
async def echo_bot(message: types.Message):
	await message.answer(message.text)

bot.executor()
```

---

#### Бот рандомайзер(синхронный):
```python
from EasyGram import SyncBot, types
from random import randint

bot = SyncBot('Token here')

@bot.message(commands='start')
def start(message: types.Message):
	#Делаем маленькую кнопку
	button = types.ReplyKeyboardMarkup(resize_keyboard=True)
	button.add('От 1 до 10')
	
	message.answer('Привет!', reply_markup=button)

@bot.message(lambda message: message.text == 'От 1 до 10')
def random_number(message: types.Message):
	message.answer(f'Тебе выпало: {randint(1, 10)}!')

bot.polling()
```


#### Бот рандомайзер(асинхронный)
```python
from EasyGram.Async import AsyncBot, types
from random import randint

bot = AsyncBot('Token here')

@bot.message(commands='start')
async def start(message: types.Message):
	#Делаем маленькую кнопку
	button = types.ReplyKeyboardMarkup(resize_keyboard=True)
	button.add('От 1 до 10')
	
	await message.answer('Привет!', reply_markup=button)

@bot.message(lambda message: message.text == 'От 1 до 10')
async def random_number(message: types.Message):
	await message.answer(f'Тебе выпало: {randint(1, 10)}!')

bot.executor()
```
## Что нового?
С новой версии `0.0.2` добавилось:
- В `SyncBot` и `AsyncBot` добавлена возможность запускать ботов с многопоточностью, дабы придать больше скорости вашему боту!

Чтобы сделать это в `SyncBot` требуется указать параметр `threaded_run=True`.
### Пример:
```python
from EasyGram import SyncBot

bot = SyncBot('Token')

#... Остальной код

bot.polling(threaded_run=True)
```

С `AsyncBot` тоже нужно указать параметр `threaded_run=True` в `executor()` или `polling()`.
### Пример:
```python
from EasyGram.Async import AsyncBot

bot = AsyncBot('Token')

#... Остальной код

bot.executor(threaded_run=True)
```
*По желанию можно установить параметр thread_max_works=15.Это максимальное кол-во потоков которое можно использовать.*
> [!WARNING]
_Не ставить много, иначе может быть будет сильная нагрузка на процессор!_
- Теперь можно добавить команды в панель команд(лист с командами, менюшка команд, как угодно) с помощью `set_my_commands()`

### Пример:
```python
from EasyGram.Async import AsyncBot, types

bot = AsyncBot('Token')

commands = [
    types.BotCommand(command='start', description='Run bot'),
    types.BotCommand(command='help', description='help')
]

bot.set_my_commands(commands, scope=types.BotCommandScopeAllGroupChats()) #scope по желанию
```

Тоже самое и с `SyncBot`
### Пример:
```python
from EasyGram import SyncBot, types

bot = SyncBot('Token')

commands = [
    types.BotCommand(command='start', description='Run bot')
]

bot.set_my_commands(commands, scope=types.BotCommandScopeAllGroupChats()) #scope по желанию
```
- Появились два метода в объекте `InlineKeyboardMarkup`: `add_tostorage()` и `add_keyboards()`.

Первый `add_tostorage(*args: types.InlineKeyboardButton)` добавляет объекты в список `types.InlineKeyboardMarkup.storage`, а второй `types.InlineKeyboardMarkup.add_keyboards()` в один ряд добавляет кнопки.

- Добавлен метод удаления сообщения.
### Пример:
С `SyncBot`
```python
from EasyGram import SyncBot, types

bot = SyncBot('Token here')

#... остальной код

@bot.message()
def messages(message: types.Message):
    bot.delete_message(message.chat.id, message.message_id-1) #Удаления предыдущего сообщения
    message.delete() #Удаления этого сообщения, т.е от пользователя

#Удаления в CallbackQuery
@bot.callback_query()
def call(call: types.CallbackQuery):
    bot.delete_message(call.chat.id, call.message.message_id-1)
    call.message.delete() # Удаления сообщения куда пользовать нажал на кнопку
    
bot.polling()
```
---
С `AsyncBot`
```python
from EasyGram.Async import AsyncBot, types

bot = AsyncBot('Token here')

#... остальной код

@bot.message()
async def messages(message: types.Message):
    await bot.delete_message(message.chat.id, message.message_id-1) #Удаления предыдущего сообщения
    await message.delete() #Удаления этого сообщения, т.е от пользователя

#Удаления в CallbackQuery
@bot.callback_query()
async def call(call: types.CallbackQuery):
    await bot.delete_message(call.chat.id, call.message.message_id-1)
    await call.message.delete() # Удаления сообщения куда пользовать нажал на кнопку

bot.executor()
```

- Добавлен метод редактирования сообщения.

### Пример:
С `SyncBot`
```python
from EasyGram import SyncBot, types
from time import sleep

bot = SyncBot('Token here')

#... остальной код

@bot.message()
def message(message: types.Message):
    msg: types.Message = message.answer('Привет')
    sleep(10)# !!!!!Работает корректно только если в bot.polling() установлен параметр threaded_run=True
    msg.edit('Как дела?')

bot.polling(threaded_run=True)
```
С `AsyncBot`
```python
from EasyGram.Async import AsyncBot, types
from asyncio import sleep

bot = AsyncBot('Token here')

#... остальной код

@bot.message()
async def message(message: types.Message):
    msg: types.Message = await message.answer('Привет')
    await sleep(10)
    await msg.edit('Как дела?')

bot.executor()
```

- Добавлен метод отправления опроса.
### Пример:
С `SyncBot`
```python
from EasyGram import SyncBot, types
from time import sleep

bot = SyncBot('Token here')

#... остальной код

@bot.message()
def message(message: types.Message):
    message.send_poll('Как дела?', [types.InputPollOption('<b>Отлично</b>', text_parse_mode='html'), types.InputPollOption('Плохо')])
    bot.send_poll(message.from_user.id, 'Как дела?', [types.InputPollOption('<b>Отлично</b>', text_parse_mode='html'), types.InputPollOption('Плохо')])

bot.polling()
```
С `AsyncBot`
```python
from EasyGram.Async import AsyncBot, types
from asyncio import sleep

bot = AsyncBot('Token here')

#... остальной код

@bot.message()
async def message(message: types.Message):
    await message.send_poll('Как дела?', [types.InputPollOption('<b>Отлично</b>', text_parse_mode='html'), types.InputPollOption('Плохо')])
    await bot.send_poll(message.from_user.id, 'Как дела?', [types.InputPollOption('<b>Отлично</b>', text_parse_mode='html'), types.InputPollOption('Плохо')])

bot.executor()
```

В объекте `ParseMode` добавлены методы для форматирования текста
```python
from EasyGram.types import ParseMode

print(ParseMode.hbold('test')) # <b>test</b>
print(ParseMode.hitalic('test')) # <i>test</i>
print(ParseMode.hstrikeline('test')) # <s>test</s>
print(ParseMode.hunderline('test')) # <u>test</u>
print(ParseMode.hblockquote('test')) # <blockquote>test</blockquote>
print(ParseMode.hcode('test')) # <code>test</code>
print(ParseMode.hprecode(lang='python', text='test')) # <pre><code class="python">test</code></pre>
```

- Добавлен метод `next_step_handler()`.С помощью него можно вызвать функцию как только пользователь отправит сообщение.
### Пример:
С `SyncBot`
```python
from EasyGram import SyncBot, types

bot = SyncBot('Token here')

@bot.message(commands='start')
def start(message: types.Message):
    message.reply('Привет, введи своё имя.')
    bot.next_step_handler(message.chat.id, nexts) #Ожидания сообщения от пользователя
def nexts(message: types.Message):
    message.answer(f'Приятно познакомиться {message.text}')

bot.polling()
```
С `AsyncBot`
```python
from EasyGram.Async import AsyncBot, types

bot = AsyncBot('Token here')

@bot.message(commands='start')
async def start(message: types.Message):
    await message.answer('Привет, введи своё имя.')
    await bot.next_step_handler(message.chat.id, nexts) #Ожидания сообщения от пользователя
async def nexts(message: types.Message):
    await message.answer(f'Приятно познакомиться {message.text}')

bot.executor()
```

- Добавлены новые методы в `SyncBot`/`AsyncBot`:
1. `delete_message()`
2. `edit_message_text()`
3. `send_poll()`
4. `send_audio()`
5. `send_documen()`
6. `send_animation()`
7. `send_voice()`
8. `send_video()`
9. `send_video_note()`
10. `send_paid_media()`
11. `send_contact()`
12. `send_dice()`
13. `send_chat_action()`

- Добавлены дополнительные методы к классу Message:
1. `types.Message.delete()`
2. `types.Message.edit()`
3. `types.Message.reply()`
4. `types.Message.send_poll()`
5. `types.Message.send_audio()`
6. `types.Message.send_document()`
7. `types.Message.send_animation()`
8. `types.Message.send_voice()`
9. `types.Message.send_video()`
10. `types.Message.send_video_note()`
11. `types.Message.send_paid_media()`
12. `types.Message.send_contact()`
13. `types.Message.send_dice()`
14. `types.Message.send_chat_action()`

## Что добавить ещё?
Связаться:
- 📞💌Telegram channel: [Channel](https://t.me/oprosmenya)
    """,
    long_description_content_type='text/markdown',
    author='flexyyy',
    packages=find_packages(),
    package_data={
        "": ['readme.md']
    },
    install_requires=[
        'aiohttp'
    ],
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires='>=3.7',
    url='https://github.com/flexyyyapk/EasyGram/'
)