Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def daily_mechanism(dict_event, answer, user, days_limit, auto_add, starts_from_the_first, week_limit, item='daily'):
- """
- That is an implementation of daily bonus checking mechanism. We take client time and compare with server time. If
- diff is less than 12 hours we may say that user has correctly synchronized local time on his device.
- User must has integer "daily" and "daily_row" fields for storing daily bonus info (for example look over
- FruitQuestSettings in modules/fruitquest/fruitqusest.py, especially part about _attributes)
- :param dict_event: the income/outcome dict, which content is changed in that method
- :param answer: the income/outcome dict, which content is changed in that method
- :param user: user's instance
- :param days_limit: limit size of
- :param auto_add: should we automatically increment the user's profile bonuses if the user can get the bonus
- :param starts_from_the_first: should we start from the first day if the daily_row reaches the 'day_limit'
- :param item: default key for the 'dict_event' argument
- :return:
- """
- def perform():
- # try:
- if isinstance(dict_event[item], dict):
- time_in_sec, need_confirmation, is_weekly, confirmed = (int(dict_event[item]['time']),
- dict_event[item].get('need_confirmation', False),
- dict_event[item].get('is_weekly', False),
- dict_event[item].get('confirmed', False)
- )
- else:
- time_in_sec, need_confirmation, is_weekly, confirmed = int(dict_event[item]), False, False, True
- # TODO return 60*60*12
- from modules import logg
- if abs(int(time.time()) - int(time_in_sec)) < 60*60*55:
- diff = time_in_sec - user.settings['daily']
- # todo set eq 86400 60*60*24
- if diff >= 10:
- bonus_data = admin().return_anon_content(user.model.application, 'bonus')
- if bonus_data['rc'] == 0:
- bonus_type = sorted(bonus_data['answer'], key=lambda k: k['day'], reverse=True)
- answer.update({'daily_bonus_prizes': bonus_type})
- if auto_add:
- # in this case we not just return the data about the available prizes
- # but also autoincrement user's profile for the size of tis bonus.
- #
- # The 'daily_bonus_prizes' in the answer just informs the user, what bonuses he/she can
- # has.
- today_bonus = bonus_type[::-1][(user.settings['daily_row'] - 1) % days_limit - 1]
- user.increase(today_bonus['type'], today_bonus['qty'])
- if diff <= 60*60*48:
- user.increase('daily_row', 1)
- user.settings['daily_row'] = (user.settings['daily_row'] - 1) % days_limit + 1
- if starts_from_the_first:
- answer.update({'daily_bonus_day': user.settings['daily_row']})
- else:
- answer.update({'daily_bonus_day': days_limit if user.settings['daily_row'] > days_limit
- else user.settings['daily_row']})
- if is_weekly:
- answer.update({'bonus_week': user.settings['weekly_row']})
- if is_weekly and user.settings['daily_row'] == days_limit:
- user.increase('weekly_row', 1)
- user.settings['weekly_row'] = (user.settings['weekly_row'] - 1) % week_limit + 1
- week_bonus = admin().return_anon_content(user.model.application, 'weekly_bonus')
- bonus_type = sorted(week_bonus['answer'], key=lambda k: k['week'], reverse=True)
- answer.update({'weekly_bonus_prizes': bonus_type})
- if user.settings['weekly_row'] == week_limit:
- final_reward = admin().return_anon_content(user.model.application, 'weekly_final_bonus')
- answer.update({'final_reward': final_reward['answer']})
- user.settings['weekly_row'] = 0
- else:
- if not need_confirmation:
- user.settings['daily_row'] = 1
- answer.update({'daily_bonus_day': user.settings['daily_row']})
- if not confirmed and need_confirmation and user.settings['daily_row'] != 1:
- return answer.update({'confirmation required': True})
- user.increase(item, day_start(diff))
- else:
- answer.update({'daily_bonus_prizes': 0})
- else:
- answer.update({'daily_bonus_prizes': 0})
- # except KeyError:
- # pass
- optimistic(attempts, perform)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement