Exemplo n.º 1
0
def reward_calculation(user_id) -> float:
    from bot.db import User
    user = User.get_user(user_id)
    if user.clan_level < 4:
        # user_discount = config.DISCOUNT_TABLE[user.clan.color][user.clan_level - 1] \
        #                            - config.DISCOUNT_TABLE[user.clan.color][user.clan_level]
        user_discount = config.DISCOUNT_TABLE[user.clan.color][user.clan_level] \
                        - config.DISCOUNT_TABLE[user.clan.color][user.clan_level + 1]
    else:
        user_discount = Decimal('0.0')
    user_ref_count = User.get_user_ref_count(user_id)
    if user.totem_animal == 'Dragon':
        personal_allowance = Decimal('0.15')
    elif user.totem_animal == 'Lion':
        personal_allowance = Decimal('0.10')
    elif user.totem_animal == 'Wolf':
        personal_allowance = Decimal('0.05')

    deal = calculate_tree_reward(user)
    if user.clan_leader:
        reward = (user_discount + personal_allowance) * user.clan.balance
        print(
            'cl_reward',
            f'({user_discount}+{personal_allowance})*{deal}={reward} {user.first_name}'
        )
    else:
        reward = (user_discount + personal_allowance) * deal
        print(
            'cl_reward',
            f'({user_discount}+{personal_allowance})*{deal}={reward} {user.first_name}'
        )
    return reward
Exemplo n.º 2
0
async def user_statistic(msg: types.Message):
    user = User.get_user(msg.from_user.id)
    if user.clan_leader:
        await msg.answer(texts['user_statistic'].format(
            user.clan.id + 1,
            user.clan.color,
            user.clan_level,
            User.get_user_ref_count(msg.from_user.id),
            user.totem_animal,
            reward_calculation(user.user_id),
            Decimal(str(user.clan.balance)),
            user.eth_address,
            User.get_ref_link(msg.from_user.id)
        ), reply_markup=kb.get_about_menu(True))
        await msg.answer(text=await UserHistory.get_history(msg.from_user.id))
    else:
        await msg.answer(texts['user_statistic'].format(
            User.get_user_ref_count(msg.from_user.id),
            user.clan.id + 1,
            user.clan.color,
            user.clan_level,
            user.totem_animal,
            reward_calculation(user.user_id),
            Decimal(str(user.clan.balance)),
            user.eth_address,
            User.get_ref_link(msg.from_user.id)
        ), reply_markup=kb.get_about_menu())
        await msg.answer(await UserHistory.get_history(msg.from_user.id))
Exemplo n.º 3
0
async def check_transaction_status(c: types.CallbackQuery, state: FSMContext):
    user_id = c.from_user.id
    u = User.get_user(user_id)
    transaction_value = await get_transaction_value(u.eth_address)
    if transaction_value >= Decimal(str(config.ENTRY_COST)):
        await bot.send_message(
            user_id,
            texts['eth_address']['approve_processing_success'],
            reply_markup=kb.main_kb_approve)
        await c.message.delete_reply_markup()
        current_state = await state.get_state()
        User.user_approve(user_id=user_id)
        user = User.get_user(c.from_user.id)
        user.balance = transaction_value
        clan = Clan.get_clan(user.clan.id)
        clan.balance += transaction_value
        user.balance = transaction_value
        user.save()
        clan.save()
        if current_state is None:
            return
        await state.finish()
        await c.message.answer('Ваша реферальная ссылка - {}'.format(
            User.get_ref_link(c.message.from_user.id)))
    else:
        await bot.send_message(
            user_id, texts['eth_address']['approve_processing_decline'])
        await bot.send_message(user_id,
                               texts['eth_address']['approve_address'].format(
                                   config.ENTRY_COST,
                                   config.TARGET_EPH_ADDRESS),
                               reply_markup=kb.check_transaction_kb)
    await bot.answer_callback_query(c.id)
Exemplo n.º 4
0
async def start(msg: types.Message):
    if not User.user_exists(msg.from_user.id):
        User.create_user(msg)
        await msg.answer(texts['start']['new_user'], reply_markup=kb.main_kb_start)
    elif User.user_is_approved(msg.from_user.id):
        await msg.answer('Welcome back', reply_markup=kb.main_kb_approve)
    else:
        await msg.answer(texts['start']['new_user'], reply_markup=kb.main_kb_start)
    if not User.eth_address_exist(user_id=msg.from_user.id):
        await msg.answer(texts['eth_address']['request'])
        await EthereumAddress.get_address.set()
Exemplo n.º 5
0
async def change_address(msg: types.Message, state: FSMContext):
    if validate_ethereum_address(msg.text):
        if User.eth_address_unical(msg.text):
            if User.eth_address_exist(msg.from_user.id):
                User.set_eth_address(msg.from_user.id, msg.text)
                await msg.answer(texts['eth_address']['address_change_success'])
                if not User.user_is_approved(msg.from_user.id):
                    await msg.answer(texts['eth_address']['approve_address'].format(
                        config.ENTRY_COST,
                        config.TARGET_EPH_ADDRESS
                    ), reply_markup=kb.check_transaction_kb)
                await state.finish()
            else:
                await msg.answer(texts['eth_address']['address_decline'])
        else:
            await msg.answer(texts['eth_address']['address_decline'])
    else:
        await msg.answer(texts['eth_address']['address_decline'])
Exemplo n.º 6
0
async def send_clan_member_result(clan, result_balance):
    from bot.db import User
    clan_members = User.select().where(User.clan == clan)
    if clan_members.count() > 0:
        for member in clan_members:
            await bot.send_message(
                member.user_id,
                texts['user_round_result']['clan_result'].format(
                    result_balance, clan.color))
Exemplo n.º 7
0
async def clan_statistic(c: types.CallbackQuery):
    user = User.get_user(user_id=c.from_user.id)
    clan = Clan.get_clan(clan_id=user.clan.id)
    clan_member_count = Clan.get_member_count(clan_id=clan.id)
    await bot.send_message(
        user.user_id,
        texts['clan_statistic'].format(clan.id + 1, clan.color,
                                       clan_member_count, clan.balance))
    await bot.send_message(user.user_id, ClanHistory.get_history(clan.id))
    await c.answer()
Exemplo n.º 8
0
def calculate_tree_reward(user, deel_balance=Decimal(str(0))):
    from bot.db import User
    refferals = User.select().where(User.inviter_id == user.user_id)
    if refferals.count() == 0:
        # print('last rekursion', user.user_id, f'balance = {deel_balance}')
        return Decimal(str(user.balance))
    else:
        # deel_balance += Decimal(str(user.balance))
        for refferall in refferals:
            # print('recursion to', refferall.user_id, f'balance = {deel_balance}')
            deel_balance += calculate_tree_reward(refferall,
                                                  deel_balance=deel_balance)
            # print('for balance', deel_balance)
        return deel_balance + Decimal(str(user.balance))
def update_cache(user: db.User, years_of_quotes: Dict[int, bool],
                 filter_quote_by_max_length_text: Optional[int],
                 log: logging.Logger, update: Update,
                 context: CallbackContext):
    years = [
        year for year, is_selected in years_of_quotes.items() if is_selected
    ]
    log.debug(f'Start [{update_cache.__name__}], selected years: {years}')

    if 'quotes' not in context.user_data:
        context.user_data['quotes'] = []

    quotes = context.user_data['quotes']
    quotes.clear()

    if years:
        log.debug(f'Quotes from year(s): {", ".join(map(str, years))}.')

    quotes += user.get_user_unique_random(
        years=years,
        filter_quote_by_max_length_text=filter_quote_by_max_length_text)

    log.debug(f'Finish [{update_cache.__name__}]. Quotes: {len(quotes)}')
Exemplo n.º 10
0
        def wrapper(update: Update, context: CallbackContext):
            func_name = func.__name__
            user_db = chat_db = None

            if update:
                user = update.effective_user
                chat = update.effective_chat

                user_db = User.get_from(user)
                if user_db:
                    user_db.actualize(user)

                chat_db = Chat.get_from(chat)
                if chat_db:
                    chat_db.actualize(chat)

            try:
                message = update.effective_message.text
            except:
                message = None

            try:
                query_data = update.callback_query.data
            except:
                query_data = None

            t = time.perf_counter_ns()
            result = func(update, context)
            elapsed_ms = (time.perf_counter_ns() - t) // 1_000_000

            log.debug(f'[{func_name}] Elapsed {elapsed_ms} ms')

            # Поддержка List[Quote] (для on_get_quotes). Это для учёта цитат среди
            # просмотренных ранее при получении группы цитат из результата поиска
            # через встроенные кнопки
            quote_dbs = []

            # Если вернулся список цитат
            if isinstance(result, list):
                for x in result:
                    if isinstance(x, Quote):
                        quote_dbs.append(x)

            elif isinstance(result, Quote):
                quote_dbs.append(result)
            else:
                # Request нужно в любом случае создать
                quote_dbs.append(None)

            for quote_db in quote_dbs:
                Request.create(
                    func_name=func_name,
                    elapsed_ms=elapsed_ms,
                    user=user_db,
                    chat=chat_db,
                    quote=quote_db,
                    message=message,
                    query_data=query_data,
                )

            return result
Exemplo n.º 11
0
async def address_processing(msg: types.Message, state: FSMContext):
    if validate_ethereum_address(msg.text):
        if User.eth_address_unical(msg.text):
            if User.eth_address_exist(msg.from_user.id):
                User.set_eth_address(msg.from_user.id, msg.text)
            else:
                User.set_eth_address(msg.from_user.id, msg.text)
            await EthereumAddress.check_transaction.set()
            if User.is_clan_leader(msg.from_user.id):
                user = User.get_user(msg.from_user.id)
                clan_id = user.clan.id + 1
                await msg.answer(
                    texts['eth_address']['approve_address_for_admin'].format(clan_id, User.get_ref_link(user.user_id)),
                    reply_markup=kb.main_kb_approve)
                User.user_approve(msg.from_user.id)
                await state.finish()
            else:
                await msg.answer(texts['eth_address']['approve_address'].format(
                    config.ENTRY_COST,
                    config.TARGET_EPH_ADDRESS
                ), reply_markup=kb.check_transaction_kb)
                await state.finish()
        else:
            u = User.get_user(msg.from_user.id)
            if u.eth_address == msg.text:
                User.set_eth_address(u.user_id, msg.text)

                await state.finish()
            else:
                await msg.answer(texts['eth_address']['address_decline'])
    else:
        await msg.answer(texts['eth_address']['address_decline'])
Exemplo n.º 12
0
async def get_ref_link(msg: types.Message):
    await msg.answer(User.get_ref_link(msg.from_user.id))