Ejemplo n.º 1
0
    def stop_if_need(self):
        self.get_server_info()
        # Если сервак онлайн и нет игроков
        if self.server_info['online'] and not self.server_info['players']:
            obj, created = Service.objects.get_or_create(name=f'stop_minecraft_{self.version}')

            # Создание событие. Уведомление, что мы скоро всё отрубим
            if created:
                message = f"Если никто не зайдёт на сервак по майну {self.version}, то через полчаса я его остановлю"
                users_notify = VkUser.objects.filter(groups__name=Role.MINECRAFT_NOTIFY.name)
                users_chat_id_notify = [user.user_id for user in users_notify]
                self.vk_bot.parse_and_send_msgs_thread(users_chat_id_notify, message)

            # Если событие уже было создано, значит пора отрубать
            else:
                update_datetime = obj.update_datetime
                delta_seconds = (datetime.utcnow() - remove_tz(update_datetime)).seconds
                if delta_seconds <= 1800 + 100:
                    obj.delete()
                    Service.objects.get_or_create(name=f"minecraft_{self.version}")

                    self.stop(send_notify=False)

                    message = f"Вырубаю майн {self.version}"
                    users_notify = VkUser.objects.filter(groups__name=Role.MINECRAFT_NOTIFY.name)
                    users_chat_id_notify = [user.user_id for user in users_notify]
                    self.vk_bot.parse_and_send_msgs_thread(users_chat_id_notify, message)
                else:
                    obj.delete()

        # Эта ветка нужна, чтобы вручную вырубленные серверы не провоцировали при последующем старте отключение в 0/30 минут
        else:
            Service.objects.filter(name=f'stop_minecraft_{self.version}').delete()
Ejemplo n.º 2
0
    def get_weather(self, use_cached=True):
        entity, created = Service.objects.get_or_create(name=f'weather_{self.city.name}')
        if use_cached and not created:
            delta_time = (datetime.utcnow() - remove_tz(entity.update_datetime))
            if delta_time.seconds < 3600 and delta_time.days == 0:
                weather_data = json.loads(entity.value)
                return weather_data

        weather_data = self.send_weather_request()
        entity.value = json.dumps(weather_data)
        entity.save()
        return weather_data
Ejemplo n.º 3
0
    def start(self):
        if self.vk_event.sender.city is None:
            return "Не знаю ваш город. /город"
        if not check_user_group(self.vk_event.sender, Role.TRUSTED) and \
                len(NotifyModel.objects.filter(author=self.vk_event.sender)) >= 5:
            return "Нельзя добавлять более 5 напоминаний"
        user_timezone = self.vk_event.sender.city.timezone.name

        date, args_count, exact_time_flag = get_time(self.vk_event.args[0],
                                                     self.vk_event.args[1])
        if args_count == 2:
            self.check_args(3)
        if not date:
            return "Не смог распарсить дату"
        date = normalize_datetime(date, user_timezone)
        datetime_now = localize_datetime(datetime.utcnow(), "UTC")

        if (date - datetime_now).seconds < 60:
            return "Нельзя добавлять напоминание на ближайшую минуту"
        if not exact_time_flag and ((date - datetime_now).days < 0 or
                                    (datetime_now - date).seconds < 0):
            date = date + timedelta(days=1)
        if (date - datetime_now).days < 0 or (datetime_now - date).seconds < 0:
            return "Нельзя указывать дату в прошлом"

        text = self.vk_event.original_args.split(' ', args_count)[args_count]
        if text[0] == '/':
            first_space = text.find(' ')
            if first_space > 0:
                command = text[1:first_space]
            else:
                command = text[1:]
            from apps.API_VK.command.commands.NotifyRepeat import NotifyRepeat
            if command in self.names or command in NotifyRepeat().names:
                text = f"/обосрать {self.vk_event.sender.name}"
        notify_datetime = localize_datetime(remove_tz(date), user_timezone)

        notify = NotifyModel(
            date=date,
            text=text,
            author=self.vk_event.sender,
            chat=self.vk_event.chat,
            text_for_filter=notify_datetime.strftime("%d.%m.%Y %H:%M") + " " +
            text)
        if self.vk_event.attachments:
            notify.attachments = json.dumps(self.vk_event.attachments)
        notify.save()
        notify.text_for_filter += f" ({notify.id})"
        notify.save()

        return f'Сохранил на дату {str(notify_datetime.strftime("%d.%m.%Y %H:%M"))}'
Ejemplo n.º 4
0
 def menu_bonus(self):
     datetime_now = localize_datetime(datetime.datetime.utcnow(),
                                      "Europe/Moscow")
     datetime_last = localize_datetime(
         remove_tz(self.gamer.roulette_points_today), "Europe/Moscow")
     if self.gamer.roulette_points > 10000:
         return "Тебе хватит и так"
     if (datetime_now.date() - datetime_last.date()).days > 0:
         self.gamer.roulette_points += 500
         self.gamer.roulette_points_today = datetime_now
         self.gamer.save()
         return "Выдал пособие по безработице"
     else:
         return "Приходи завтра"
Ejemplo n.º 5
0
def get_notifies_from_object(notifies_obj, timezone, print_username=False):
    if len(notifies_obj) == 0:
        return "Нет напоминаний"
    result = ""

    for notify in notifies_obj:
        notify_datetime = localize_datetime(remove_tz(notify.date), timezone)

        if print_username:
            result += f"{notify.author}\n"
        if notify.repeat:
            result += f"{str(notify_datetime.strftime('%H:%M'))} - Постоянное"
        else:
            result += f"{str(notify_datetime.strftime('%d.%m.%Y %H:%M'))}"
        if notify.chat:
            result += f" (Конфа - {notify.chat.name})"
        result += f"\n{notify.text}\n\n"

    return result
Ejemplo n.º 6
0
    def menu_play(self):
        with lock:
            winner_today = PetrovichGames.objects.filter(
                chat=self.vk_event.chat).last()
            if winner_today:
                datetime_now = localize_datetime(datetime.datetime.utcnow(),
                                                 "Europe/Moscow")
                datetime_last = localize_datetime(remove_tz(winner_today.date),
                                                  "Europe/Moscow")
                if (datetime_now.date() - datetime_last.date()).days <= 0:
                    if winner_today.user.gender == '1':
                        winner_gender = "Петровна"
                    else:
                        winner_gender = "Петрович"
                    return f"{winner_gender} дня - {winner_today.user}"

            winner = PetrovichUser.objects.filter(
                chat=self.vk_event.chat, active=True).order_by("?").first()
            if winner:
                winner = winner.user
            else:
                return "Нет участников игры. Зарегистрируйтесь! /петрович рег"

            PetrovichGames.objects.filter(chat=self.vk_event.chat).delete()
            PetrovichGames(user=winner, chat=self.vk_event.chat).save()
            winner_petrovich = PetrovichUser.objects.filter(
                user=winner, chat=self.vk_event.chat).first()
            winner_petrovich.wins += 1
            winner_petrovich.save()
            if winner_petrovich.user.gender == '1':
                winner_gender = "Наша сегодняшняя Петровна дня"
            else:
                winner_gender = "Наш сегодняшний Петрович дня"
            messages = [
                "Такс такс такс, кто тут у нас",
                f"{winner_gender} - [{winner.nickname}|{winner.name} {winner.surname}]"
            ]
            return messages
Ejemplo n.º 7
0
    def start(self):

        user = self.vk_bot.get_user_by_name(self.vk_event.args,
                                            self.vk_event.chat)

        if self.vk_event.sender.city and self.vk_event.sender.city.timezone:
            timezone = self.vk_event.sender.city.timezone.name
        else:
            timezone = TIME_ZONE
        today = localize_datetime(datetime.datetime.utcnow(), timezone)
        log = Log.objects.filter(success=True,
                                 date__year=today.year,
                                 date__month=today.month,
                                 date__day=today.day,
                                 author=user).first()
        if user is None:
            msg = "Такого пользователя нет"
        elif log is None:
            msg = "Информации пока ещё нет"
        else:
            localized_date = localize_datetime(remove_tz(log.date), timezone)
            msg = "%s\n%s" % (localized_date.strftime("%H:%M:%S"), log.msg)
        return str(msg)
Ejemplo n.º 8
0
    def handle(self, *args, **options):
        from apps.API_VK.command.CommonMethods import remove_tz, localize_datetime
        from apps.API_VK.command.CommonMethods import get_attachments_for_upload

        notifies = Notify.objects.all()

        DATETIME_NOW = datetime.utcnow()
        # DATETIME_NOW = datetime(2020, 4, 18, 12, 30, 1)
        for notify in notifies:
            try:
                if notify.repeat:
                    datetime1 = datetime.combine(date.min,
                                                 remove_tz(notify.date).time())
                    datetime2 = datetime.combine(date.min, DATETIME_NOW.time())
                    delta_time = datetime1 - datetime2 + timedelta(minutes=1)
                    flag = delta_time.seconds <= 60
                    # print(f"notify: {notify.text} - {notify.date}")
                    # print(f"datetime1: {datetime1}\ndatetime2: {datetime2}\ndelta_time:{delta_time}\nflag:{flag}\n")
                else:
                    delta_time = remove_tz(
                        notify.date) - DATETIME_NOW + timedelta(minutes=1)
                    flag = delta_time.days == 0 and delta_time.seconds <= 60

                if flag:
                    notify_datetime = localize_datetime(
                        remove_tz(notify.date),
                        notify.author.city.timezone.name)
                    message = f"Напоминалка на {notify_datetime.strftime('%H:%M')}\n" \
                              f"[id{notify.author.user_id}|{notify.author}]:\n" \
                              f"{notify.text}"
                    attachments = []
                    if notify.attachments and notify.attachments != "null":
                        notify_attachments = json.loads(notify.attachments)
                        attachments = get_attachments_for_upload(
                            vk_bot, notify_attachments)
                    result_msg = {'msg': message, 'attachments': attachments}
                    if notify.chat:
                        vk_bot.parse_and_send_msgs_thread(
                            notify.chat.chat_id, result_msg)
                    else:
                        vk_bot.parse_and_send_msgs_thread(
                            notify.author.user_id, result_msg)

                    # Если отложенная команда
                    if notify.text.startswith('/'):
                        msg = notify.text[1:]
                        vk_event = {
                            'message': {
                                'text': msg
                            },
                            'sender': notify.author,
                        }
                        if notify.chat:
                            vk_event['chat'] = notify.chat
                            vk_event['peer_id'] = notify.chat.chat_id
                        else:
                            vk_event['chat'] = None
                            vk_event['peer_id'] = notify.author.user_id

                        vk_event_object = VkEvent(vk_event)
                        vk_bot.menu(vk_event_object, send=True)
                    if notify.repeat:
                        # Для постоянных уведомлений дата должа быть на завтрашний день обязательно. Это важно для сортировки
                        new_datetime = datetime.combine(
                            DATETIME_NOW.date(),
                            notify.date.time()) + timedelta(days=1)
                        new_datetime = localize_datetime(
                            remove_tz(new_datetime),
                            notify.author.city.timezone.name)
                        notify.date = new_datetime
                        notify.save()
                    else:
                        notify.delete()
            except Exception as e:
                print(str(e))
                tb = traceback.format_exc()
                print(tb)