def give_this_week_stats(self): """ does the same as the 'recommendation_for_this_week' but can be summoned by the user every moment. It also take certain percents of the current week, not average :return: nothing """ name = "stats" + str(self.master_id) r_id = func.get_new_random_id() recommend_message = "This week the best time was " max_online, best_time, max_summary_during_the_day, best_day = 0, 0, 0, 0 for j in range(7): max_summary_during_the_day, best_day, best_time, max_online = \ self.get_one_day_information_v2(j, max_summary_during_the_day, best_day, best_time, max_online) max_average_during_the_day = max_summary_during_the_day / self.analyses_per_day sq = f"SELECT time FROM {name} WHERE analyse_number={best_time}" cur.execute(sq) recommend_time = cur.fetchone()[0] recommend_message += recommend_time + ": " + str(max_online) + "%" vk_api2.messages.send(user_id=self.master_id, message=recommend_message, random_id=r_id) recommend_message = "This week, the day with the biggest average online percent was " + \ days_of_the_week[best_day] + ": " + str(max_average_during_the_day) + "%" vk_api2.messages.send(user_id=self.master_id, message=recommend_message, random_id=(r_id + 1)) return
def give_today_stats(self): """ Gives today's time with the highest online percent :return: nothing """ name = "stats" + str(self.master_id) r_id = func.get_new_random_id() day = datetime.datetime.now().weekday() start = day * self.analyses_per_day finish = (day + 1) * self.analyses_per_day recommend_message = "Today the best time was " max_online, best_time = 0, 0 for i in range(start, finish): sq = f"SELECT archive4 FROM {name} WHERE analyse_number={i}" cur.execute(sq) current_percent = cur.fetchone() if current_percent[0] > max_online: max_online = current_percent[0] best_time = i sq = f"SELECT time FROM {name} WHERE analyse_number={best_time}" cur.execute(sq) recommend_time = cur.fetchone()[0] recommend_message += recommend_time[5:] + ": " + str(max_online) + "%" vk_api2.messages.send(user_id=self.master_id, message=recommend_message, random_id=r_id) return
def recommendation_for_this_week(self): """ function that runs weekly at about 00:00 and sends two messages: day withe the highest average percent and time(with a day) when the percent was highest Takes average percents for last four weeks :return: nothing """ # recommendation gives the day with the highest average percents past 4 last weeks name = "stats" + str(self.master_id) r_id = func.get_new_random_id() recommend_message = "Possibly, this week the best time will be " max_online, best_time, max_summary_during_the_day, best_day = 0, 0, 0, 0 for j in range(7): max_summary_during_the_day, best_day, best_time, max_online = \ self.get_one_day_information_v1(j, max_summary_during_the_day, best_day, best_time, max_online) max_average_during_the_day = max_summary_during_the_day / self.analyses_per_day sq = f"SELECT time FROM {name} WHERE analyse_number={best_time}" cur.execute(sq) recommend_time = cur.fetchone()[0] recommend_message += recommend_time + ": " + str(max_online) + "%" vk_api2.messages.send(user_id=self.master_id, message=recommend_message, random_id=r_id) recommend_message = "This week, the day with the biggest average online percent was " + \ days_of_the_week[best_day] + ": " + str(max_average_during_the_day) + "%" vk_api2.messages.send(user_id=self.master_id, message=recommend_message, random_id=(r_id + 1)) return
def recommendation_for_this_day_of_the_week(self): """ average stats and recommendation for this day of the week past 4 last weeks this function runs at about 00:00 daily and recommends: when it is going to be the best time for posts this day. :return: returns nothing, just sends a message with recommendation """ name = "stats" + str(self.master_id) r_id = func.get_new_random_id() # высняем, за сегодн давать рекомендацию или за завтра today_or_tomorrow = "today" day = datetime.datetime.now().weekday() if self.recommend_hour != 0: day = (day + 1) % 7 today_or_tomorrow = "tomorrow" # выяснили start = day * self.analyses_per_day finish = (day + 1) * self.analyses_per_day # если за нужный день нет данных, даём рекомендацию за другой, то есть основанную на сегодншней статистике sq = f"SELECT weeks_passed FROM {name} WHERE analyse_number={start}" cur.execute(sq) checker = cur.fetchone() if checker[0] == 0: day = (day - 1) % 7 start = day * self.analyses_per_day finish = (day + 1) * self.analyses_per_day # начинаем обрабатывать статистику recommend_message = f"Possibly, {today_or_tomorrow} the best time will be " max_online, best_time = 0, 0 for i in range(start, finish): sq = f"SELECT average_percent FROM {name} WHERE analyse_number={i}" cur.execute(sq) current_percent = cur.fetchone()[0] if current_percent > max_online: max_online = current_percent best_time = i sq = f"SELECT time FROM {name} WHERE analyse_number={best_time}" cur.execute(sq) recommend_time = cur.fetchone()[0] recommend_message += recommend_time[5:] + ": " + str(max_online) + "%" vk_api2.messages.send(user_id=self.master_id, message=recommend_message, random_id=r_id) return
def calculate_new_analyse_time(self): """ This function runs in the very beginning. It counts when to start analysing and when to give recommendations """ r_id = func.get_new_random_id() current_time = datetime.datetime.now().replace(second=0, microsecond=0) current_minutes = current_time.minute + current_time.hour * 60 minutes_to_wait = self.period - current_minutes % self.period # начать анализ нужно так, чтобы попасть в период, то есть чтобы анализы каждый день начинались в полночь next_analyse_time = current_time + datetime.timedelta( 0, 0, 0, minutes_to_wait // 60, minutes_to_wait % 60, 0, 0) next_recommend_time = current_time.replace( microsecond=0, second=0, minute=0, hour=0) + datetime.timedelta(days=1) ok_message = "Yes, my dear! Starting in " + str( minutes_to_wait) + " minutes!" vk_api2.messages.send(user_id=self.master_id, message=ok_message, random_id=r_id) return next_analyse_time, next_recommend_time
def work_and_print(self): """ updates data and sends current online percent :return: """ r_id = func.get_new_random_id() week_day = datetime.datetime.now().weekday() t = datetime.datetime.now() array_cell = week_day * self.analyses_per_day + ( t.hour * 60 + t.minute) // self.period percent = self.group_analyse() self.update_data(percent, array_cell) string = "Online percent in " + self.group_id + " is " + str( percent) + "%" vk_api2.messages.send(user_id=self.master_id, message=string, random_id=r_id) return
func.not_available(current_user_id) elif code == 8: # If the user needs week's best online percent and the time it happened if have_a_task and current_user_id == master_id: group.give_this_week_stats() else: func.not_available(current_user_id) elif code == 9: func.send_big_instruction(current_user_id) elif code == 10: func.task_by_button(current_user_id) elif code == 11: func.set_time(current_user_id) elif code == 12: if have_a_task and current_user_id == master_id: r_id = func.get_new_random_id() next_recommend = next_recommend.replace( hour=int(return_message[1:3])) if datetime.datetime.now().hour <= int(return_message[1:3]): next_recommend -= datetime.timedelta(days=1) vk_api2.messages.send( user_id=current_user_id, message=f"I'll send recommendations at {return_message[1:]}!", random_id=r_id) group.recommend_hour = int(return_message[1:3]) file = open(begin_file, "w") file.write( f"{group.group_id} {group.master_id} {group.period} {group.recommend_hour}" ) file.close() else: