Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
0
 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
Ejemplo n.º 6
0
    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
Ejemplo n.º 7
0
         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: