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
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))
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)
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()
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'])
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))
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()
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)}')
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
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'])
async def get_ref_link(msg: types.Message): await msg.answer(User.get_ref_link(msg.from_user.id))