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()
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
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"))}'
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 "Приходи завтра"
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
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
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)
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)