async def update_streak(self, user_id): today = utilities.get_day_start() cur_studytime = await utilities.get_redis_score( self.redis_client, "daily_" + str(today), user_id) threshold = utilities.config["business"]["min_streak_time"] # A user must study for some minimal time to be considered having studied in a time interval if cur_studytime >= threshold: # We use a auto-expiring key to implement a fluid streak system - as long as user has studied in the past 24 hours, today the user will have streak # Note this grants users a grace period of 1 day streak_name = "has_streak_today_" + str(user_id) if not self.redis_client.exists(streak_name): yesterday = today - timedelta(days=1) yesterday_str = "daily_" + str(yesterday) # TODO: fix - will have to be 2 or find some way to do this if Redis has no logs # Make sure there has been a day since the start of the bot in case there is no logs in Redis (database gets reset) if yesterday - self.birthtime < timedelta(days=1): reset = False else: reset = (await utilities.get_redis_score( self.redis_client, yesterday_str, user_id)) < threshold await self.add_streak(user_id, reset) self.redis_client.set(streak_name, 1) self.redis_client.expireat(streak_name, utilities.get_tomorrow_start())
async def update_streak(self, user_id): today = utilities.get_day_start() cur_studytime = await utilities.get_redis_score( self.redis_client, "daily_" + str(today), user_id) threshold = utilities.config["business"]["min_streak_time"] # A user must study for some minimal time to be considered having studied in a time interval if cur_studytime >= threshold: # We use a auto-expiring key to implement a fluid streak system - as long as user has studied in the past 24 hours, today the user will have streak streak_name = "has_streak_today_" + str(user_id) if not self.redis_client.exists(streak_name): yesterday = today - timedelta(days=1) yesterday_str = "daily_" + str(yesterday) # assuming there are redis logs reset = (await utilities.get_redis_score( self.redis_client, yesterday_str, user_id)) < threshold await self.add_streak(user_id, reset) self.redis_client.set(streak_name, 1) self.redis_client.expireat(streak_name, utilities.get_tomorrow_start())
async def update_streak(self, user_id): today = utilities.get_day_start() cur_studytime = await utilities.get_redis_score( self.redis_client, "daily_" + str(today), user_id) threshold = utilities.config["business"]["min_streak_time"] if cur_studytime >= threshold: streak_name = "has_streak_today_" + str(user_id) if not self.redis_client.exists(streak_name): yesterday = today - timedelta(days=1) yesterday_str = "daily_" + str(yesterday) if yesterday - self.birthtime < timedelta(days=2): reset = False else: reset = await utilities.get_redis_score( self.redis_client, yesterday_str, user_id) >= threshold await self.add_streak(user_id, reset) self.redis_client.set(streak_name, 1) self.redis_client.expireat(streak_name, utilities.get_tomorrow_start())
def test_get_day_start_yesterday_leap_day(): assert str(utilities.get_day_start()) == "2020-02-29 17:00:00"
def test_get_day_start_today_after(): assert str(utilities.get_day_start()) == "2020-01-01 17:00:00"
def test_get_day_start_today_slightly_before(): assert str(utilities.get_day_start()) == "2020-01-01 17:00:00"