Как правильно отобразить ключи в Python?

Благодарю всех за помощь заранее! У меня возникла сложность с кодом. Я не очень разбираюсь в программировании, а ChatGPT выдает не совсем подходящие результаты. Тем не менее, у меня есть возможность загружать и изменять файлы на сервере.

Я работаю с ботом на Python, и в функции send_keys_refferals реализована выдача ключей за рефералов: за каждого реферала выдается 1 ключ. Максимальное количество ключей, которые человек может получить в день, составляет 10 (без учета приглашений), к которым добавляется еще 10 ключей за рефералов, так что в итоге получается 20.

Когда я добавляю новые категории в список categories и изменяю максимальное количество выдаваемых ключей за рефералов, бот перестает выдавать ключи за рефералов вообще. Я не могу понять, в чем проблема. Кто сможет помочь найти решение?

Вопрос в следующем: Как можно настроить выдачу ключей в боте в соответствии с новыми категориями и изменениями в максимальном количестве выдаваемых ключей? 

<pre><code>def send_keys_refferals(message): 
    last_receive = db.get_last_receiving(message.chat.id, 2) 
    time_now = int(time.time()) 
    hours_24 = 86400 
    n = time_now - last_receive 
    keys = [] 
    categories = ['BIKE', 'CUBE', 'TRAIN', 'CLONE', 'MERGE'] 
    referrals_number = db.get_referrals_number(message.chat.id) 
    text = f''' 
 Ваша реферальная ссылка https://t.me/мой_никнейм_бота?start={message.chat.id} 
Вы пригласили рефералов: {referrals_number}\n\n 
        ''' 
    for c in categories: 
        for key in db.get_2_keys(c): 
            keys.append(key) 
    if n &gt;= hours_24 and referrals_number &gt; 0: 
        # Перебираем слайс кодов в размере количества рефералов 
        for key in keys[:referrals_number]: 
            print(key) 
            if key is None: 
                break 
            text += f'&lt;code&gt;{key[1]}
  • 31 августа 2024 г. 17:54
Ответы на вопрос 1
Для решения вашей проблемы нужно сначала сформулировать, что происходит в функции `send_keys_refferals`. Изменяя категории или максимальное количество ключей, тем не менее, есть несколько аспектов, которые нужно проверить.

### Анализ Кода
Давайте рассмотрим ваш код и внесем необходимые изменения, чтобы удостовериться, что он работает корректно.

1. **Получение Рефералов**: Вы получаете количество рефералов из базы данных, и это значение должно использоваться для расчета количества ключей.
2. **Периодичность**: Ваша логика ограничивает выдачу ключей каждые 24 часа (86400 секунд).
3. **Ключи**: Вы собираете все ключи из баз данных для всех категорий и используете их для выдачи.

### Проблемы
1. **Изменение категорий**: Если вы добавляете новые категории, убедитесь, что в вашей базе данных имеются соответствующие ключи для этих категорий. Например, если они не были добавлены, функция не сможет их достать.
2. **Выдача ключей**: Убедитесь, что переменная `referrals_number` соответствует реальному количеству приглашенных рефералов и учитывайте максимальное количество ключей, выдаваемых за рефералов.

### Улучшения
Попробуем внести некоторые улучшения в ваш код:

```python
def send_keys_refferals(message): 
    last_receive = db.get_last_receiving(message.chat.id, 2) 
    time_now = int(time.time()) 
    hours_24 = 86400 
    n = time_now - last_receive 
    keys = [] 
    categories = ['BIKE', 'CUBE', 'TRAIN', 'CLONE', 'MERGE']
    
    # Предположим, что max_keys - максимально доступные ключи за рефералов
    max_keys = 10  # Это можно изменить в зависимости от правил
    referrals_number = min(db.get_referrals_number(message.chat.id), max_keys)  # Ограничиваем число рефералов до max_keys
    
    text = f''' 
    Ваша реферальная ссылка: https://t.me/мой_никнейм_бота?start={message.chat.id}
    Вы пригласили рефералов: {referrals_number}\n\n 
    ''' 
    
    # Получаем ключи из всех категорий
    for c in categories: 
        keys.extend(db.get_2_keys(c))  # Добавление ключей в список

    if n >= hours_24 and referrals_number > 0: 
        # Ограничиваем количество ключей до referral_number
        keys_to_send = keys[:referrals_number]  # Если рефералов больше, чем ключей, используем только нужное количество
        
        for key in keys_to_send: 
            if key is None:
                break 
            text += f'<code>{key[1]}</code>\n'  # Здесь необходимо понимать структуру key

    else:
        text += "Вы не можете получить ключи еще. Подождите 24 часа."
        
    # Отправляем сообщение пользователю
    # bot.send_message(chat_id=message.chat.id, text=text, parse_mode='HTML')
```

### Основные изменения:
- **Ограничение по максимальному количеству ключей**: Мы добавили переменную `max_keys`, что позволяет больше контролировать, сколько ключей можно дать за рефералов.
- **Проверка на доступные ключи**: Мы теперь используем `keys[:referrals_number]`, чтобы предотвратить выдачу большего количества ключей, чем доступно.
- **Структура `key`**: Убедитесь, что вы правильно структурируете `key`, когда добавляете его в текст.

### Проверьте:
1. **Наличие ключей в базе данных**: Убедитесь, что у вас все ключи из всех новых категорий действительно существуют в базе данных.
2. **Количество рефералов**: Печать переменной `referrals_number` перед выдачей ключей поможет понять, что у вас в этой переменной. 

Если вы все еще сталкиваетесь с проблемами, пожалуйста, предоставьте больше информации о структуре вашей базы данных и методах `get_last_receiving` и `get_2_keys`.
Похожие вопросы