Advertisement
Guest User

Untitled

a guest
May 27th, 2015
261
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.04 KB | None | 0 0
  1. def daily_mechanism(dict_event, answer, user, days_limit, auto_add, starts_from_the_first, week_limit, item='daily'):
  2.     """
  3.    That is an implementation of daily bonus checking mechanism. We take client time and compare with server time. If
  4.    diff is less than 12 hours we may say that user has correctly synchronized local time on his device.
  5.  
  6.    User must has integer "daily" and "daily_row" fields for storing daily bonus info (for example look over
  7.    FruitQuestSettings in modules/fruitquest/fruitqusest.py, especially part about _attributes)
  8.  
  9.    :param dict_event: the income/outcome dict, which content is changed in that method
  10.    :param answer: the income/outcome dict, which content is changed in that method
  11.    :param user: user's instance
  12.    :param days_limit: limit size of
  13.    :param auto_add: should we automatically increment the user's profile bonuses if the user can get the bonus
  14.    :param starts_from_the_first: should we start from the first day if the daily_row reaches the 'day_limit'
  15.    :param item: default key for the 'dict_event' argument
  16.    :return:
  17.    """
  18.  
  19.     def perform():
  20.         # try:
  21.         if isinstance(dict_event[item], dict):
  22.             time_in_sec, need_confirmation, is_weekly, confirmed = (int(dict_event[item]['time']),
  23.                                                                     dict_event[item].get('need_confirmation', False),
  24.                                                                     dict_event[item].get('is_weekly', False),
  25.                                                                     dict_event[item].get('confirmed', False)
  26.                                                                     )
  27.         else:
  28.             time_in_sec, need_confirmation, is_weekly, confirmed = int(dict_event[item]), False, False, True
  29.  
  30.         # TODO return 60*60*12
  31.         from modules import logg
  32.         if abs(int(time.time()) - int(time_in_sec)) < 60*60*55:
  33.             diff = time_in_sec - user.settings['daily']
  34.             # todo set eq 86400 60*60*24
  35.             if diff >= 10:
  36.                 bonus_data = admin().return_anon_content(user.model.application, 'bonus')
  37.                 if bonus_data['rc'] == 0:
  38.                     bonus_type = sorted(bonus_data['answer'], key=lambda k: k['day'], reverse=True)
  39.                     answer.update({'daily_bonus_prizes': bonus_type})
  40.                     if auto_add:
  41.                         # in this case we not just return the data about the available prizes
  42.                         # but also autoincrement user's profile for the size of tis bonus.
  43.                         #
  44.                         # The 'daily_bonus_prizes' in the answer just informs the user, what bonuses he/she can
  45.                         # has.
  46.                         today_bonus = bonus_type[::-1][(user.settings['daily_row'] - 1) % days_limit - 1]
  47.                         user.increase(today_bonus['type'], today_bonus['qty'])
  48.  
  49.                 if diff <= 60*60*48:
  50.                     user.increase('daily_row', 1)
  51.                     user.settings['daily_row'] = (user.settings['daily_row'] - 1) % days_limit + 1
  52.                     if starts_from_the_first:
  53.                         answer.update({'daily_bonus_day': user.settings['daily_row']})
  54.                     else:
  55.                         answer.update({'daily_bonus_day': days_limit if user.settings['daily_row'] > days_limit
  56.                         else user.settings['daily_row']})
  57.                     if is_weekly:
  58.                         answer.update({'bonus_week': user.settings['weekly_row']})
  59.                     if is_weekly and user.settings['daily_row'] == days_limit:
  60.                         user.increase('weekly_row', 1)
  61.                         user.settings['weekly_row'] = (user.settings['weekly_row'] - 1) % week_limit + 1
  62.                         week_bonus = admin().return_anon_content(user.model.application, 'weekly_bonus')
  63.                         bonus_type = sorted(week_bonus['answer'], key=lambda k: k['week'], reverse=True)
  64.                         answer.update({'weekly_bonus_prizes': bonus_type})
  65.                         if user.settings['weekly_row'] == week_limit:
  66.                             final_reward = admin().return_anon_content(user.model.application, 'weekly_final_bonus')
  67.                             answer.update({'final_reward': final_reward['answer']})
  68.                             user.settings['weekly_row'] = 0
  69.                 else:
  70.                     if not need_confirmation:
  71.                         user.settings['daily_row'] = 1
  72.                     answer.update({'daily_bonus_day': user.settings['daily_row']})
  73.                     if not confirmed and need_confirmation and user.settings['daily_row'] != 1:
  74.                         return answer.update({'confirmation required': True})
  75.                 user.increase(item, day_start(diff))
  76.             else:
  77.                 answer.update({'daily_bonus_prizes': 0})
  78.         else:
  79.             answer.update({'daily_bonus_prizes': 0})
  80.         # except KeyError:
  81.         #     pass
  82.  
  83.     optimistic(attempts, perform)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement