using System;
using System.Timers;
public class EventReminder
{
private Timer timer;
public EventReminder()
{
timer = new Timer();
timer.Elapsed += TimerElapsed;
timer.Interval = TimeSpan.FromHours(1).TotalMilliseconds; // Период проверки (1 час)
timer.AutoReset = true;
timer.Start();
}
private void TimerElapsed(object sender, ElapsedEventArgs e)
{
// Подключение к базе данных и выполнение запроса для получения событий
// Проверка каждого события и отправка напоминания, если необходимо
}
}
public class Program
{
public static void Main()
{
// Создание экземпляра EventReminder
EventReminder eventReminder = new EventReminder();
// Ожидание завершения программы (например, с помощью Console.ReadLine())
Console.ReadLine();
}
}
import telebot
import time
import sched
bot = telebot.TeleBot('TOKEN')
# список для хранения id пользователей
users = {}
# функция для обработки команды /start
@bot.message_handler(commands=['start'])
def start(message):
user_id = message.chat.id
# добавляем user_id в словарь
users[user_id] = True
bot.send_message(user_id, "Привет! Ты подписался на уведомления.")
# функция для отправки уведомлений
def send_notifications():
for user_id in users.keys():
bot.send_message(user_id, "Уведомление.")
# запускаем функцию через 5 минут
scheduler.enter(300, 1, send_notifications)
# инициализируем объект scheduler
scheduler = sched.scheduler(time.time, time.sleep)
# запускаем функцию send_notifications через 5 минут
scheduler.enter(300, 1, send_notifications)
# запускаем цикл планировщика
scheduler.run()
# запускаем цикл получения сообщений
bot.polling()
import { useEffect, useRef } from 'react';
import gsap from 'gsap';
import ScrollTrigger from 'gsap/ScrollTrigger';
gsap.registerPlugin(ScrollTrigger);
export default function HorizontalContent() {
const itemsRef = useRef(null);
const triggerRef = useRef(null);
useEffect(() => {
const items = itemsRef.current;
const savedPosition = sessionStorage.getItem('animationPosition');
const initialPosition = savedPosition ? JSON.parse(savedPosition) : { translateX: 0 };
const pin = gsap.fromTo(
items,
initialPosition,
{
translateX: '-300vw',
ease: 'none',
duration: 1,
scrollTrigger: {
trigger: triggerRef.current,
start: 'top top',
end: '2000 top',
scrub: 0.6,
pin: true,
},
}
);
ScrollTrigger.addEventListener('refresh', () => {
// Сохраняем текущую позицию анимации
sessionStorage.setItem('animationPosition', JSON.stringify({ translateX: pin.progress() * -300 }));
// Очищаем анимацию
pin.kill();
// Восстанавливаем исходное состояние анимации
pin.progress(0).invalidate().restart();
});
return () => {
pin.kill();
};
}, []);
return (
<div className={styles.content}>
<div className={styles.container}>
<div ref={triggerRef}>
<div ref={itemsRef} className={styles.items}>
<div className={styles.item}>
<Efficiency />
</div>
<div className={styles.item}>
<h3>Section 2</h3>
</div>
<div className={styles.item}>
<h3>Section 3</h3>
</div>
<div className={styles.item}>
<h3>Section 4</h3>
</div>
</div>
</div>
</div>
</div>
);
};
import { useHistory } from 'react-router-dom';
function ModalComponent() {
const history = useHistory();
const handleCloseModal = () => {
// Закрытие модального окна и замена текущего пути новым путем (например, '/')
history.replace('/');
};
return (
<div>
{/* Ваше содержимое модального окна */}
<button onClick={handleCloseModal}>Закрыть</button>
</div>
);
}
router.beforeEach((to, from, next) => {
const isAgreementAccepted = agreement.value;
const isUserLoggedIn = Boolean(store.state.user.token);
if (to.meta.requiresAuth && !isAgreementAccepted) {
// Если требуется аутентификация и соглашение не принято,
// перенаправляем на страницу TermsOfUseView
next({ name: "TermsOfUseView" });
} else if (to.name === "TermsOfUseView" && isAgreementAccepted) {
// Если пользователь уже принял соглашение,
// перенаправляем его на другую страницу, например, HomeView
next({ name: "HomeView" });
} else if (to.meta.requiresAuth && !isUserLoggedIn) {
// Если требуется аутентификация и пользователь не вошел в систему,
// перенаправляем на страницу AuthorizationView
next({ name: "AuthorizationView" });
} else if (to.meta.isGuest && isUserLoggedIn) {
// Если пользователь вошел в систему, но на страницу доступа только для гостей,
// перенаправляем на другую страницу, например, HomeView
next({ name: "HomeView" });
} else {
// В остальных случаях просто продолжаем навигацию
next();
}
});
if (!empty($_POST["query_check"])) {
$args = array(
'posts_per_page' => 2,
'post_type' => 'check',
's' => $query_check,
'sentence' => true
);
$posts = new WP_Query( $args );
if ( $posts->have_posts() ) {
echo '<p class="yescode">'.$successmessage.'</p>';
} else {
echo '<p class="nocode">'.$notfoundcode.'</p>';
}
}
import vk_api
login = 'log'
password = 'pass'
vk_session = vk_api.VkApi(login, password)
try:
vk_session.auth()
except vk_api.AuthError as error_msg:
print(error_msg)
# Получение истории сообщений
peer_id = 123456789 # ID диалога
history = vk_session.method('messages.getHistory', {'peer_id': peer_id})
# Отправка сообщений на другой аккаунт
new_peer_id = 987654321 # ID другого аккаунта
for message in history['items']:
text = message['text']
vk_session.method('messages.send', {'peer_id': new_peer_id, 'message': text})
const v3 = require('node-hue-api').v3;
async function uploadPhotoToAlbum(photoId, albumId) {
const username = 'your-username'; // Замените на ваше имя пользователя Hue
const bridgeIp = 'your-bridge-ip'; // Замените на IP-адрес вашего моста Hue
// Создание экземпляра Hue API
const api = await v3.api.createLocal(bridgeIp).connect(username);
// Загрузка фотографии в альбом
const response = await api.groups.createGroupScene(albumId, [photoId]);
console.log('Photo uploaded to album:', response);
}
// Использование функции для загрузки фотографии в альбом
uploadPhotoToAlbum('1_43894933', 'your-album-id'); // Замените на ваш идентификатор альбома
// может использовать onCanPlayThrough ? Или onCanPlay / onPlay
const handleOnCanPlayThrough = () => {
setLoading(false)
console.log('Video loaded')
}
<video
onCanPlayThrough={handleOnCanPlayThrough}
// ...
>
<div class="chart-container">
<canvas id="myChart"></canvas>
<div class="tooltip-line"></div>
</div>
.chart-container {
position: relative;
}
.tooltip-line {
position: absolute;
display: none;
width: 1px;
height: 100%;
background-color: black;
opacity: 0.5;
pointer-events: none;
border: dashed;
}
const chart = new Chart(document.getElementById('myChart'), {
// Конфигурация графика Chart.js
// ...
});
const tooltipLine = document.querySelector('.tooltip-line');
chart.canvas.addEventListener('mousemove', function(e) {
const rect = chart.canvas.getBoundingClientRect();
const xPos = e.clientX - rect.left;
tooltipLine.style.left = xPos + 'px';
tooltipLine.style.display = 'block';
});
chart.canvas.addEventListener('mouseout', function(e) {
tooltipLine.style.display = 'none';
});
function limit_post_tags($postarr) {
$tags = isset($postarr['tags_input']) ? explode(',', $postarr['tags_input']) : array();
// Установите максимальное количество меток
$max_tags = 3;
if (count($tags) > $max_tags) {
// Если количество меток превышает максимальное, удалите лишние
$postarr['tags_input'] = implode(',', array_slice($tags, 0, $max_tags));
}
return $postarr;
}
add_filter('wp_insert_post_data', 'limit_post_tags');
<body>
<header>
<!-- Ваш хедер -->
</header>
<main>
<!-- Основной контент страницы -->
</main>
<footer>
<!-- Ваш футер -->
</footer>
</body>
*, *::before, *::after {
margin: 0;
padding: 0;
}
html {
height: 100%;
}
body {
height: 100%;
display: flex;
flex-direction: column;
}
body {
flex: 1; /* Расширяет основной контент на все доступное пространство */
}
header, footer {
flex-shrink: 0; /* Предотвращает сжатие хедера и футера */
}
sudo chown -R $USER:www-data /var/www/html
sudo find /var/www/html -type d -exec chmod 750 {} \;
sudo find /var/www/html -type f -exec chmod 640 {} \;
sudo chmod g+s /var/www/html
self.skipWaiting()
в Service Worker можно отправить сообщение об успешном сбросе кеша обратно в клиентскую часть приложения, используя postMessage()
. В клиентской части вы можете прослушивать это сообщение и выполнить обновление страницы с помощью location.reload()
или другого подходящего метода.// Service Worker
self.addEventListener('message', event => {
if (event.data && event.data.type === 'SKIP_WAITING') {
self.skipWaiting();
event.source.postMessage({ type: 'CACHE_RESET_SUCCESS' });
}
});
// client
navigator.serviceWorker.addEventListener('message', event => {
if (event.data && event.data.type === 'CACHE_RESET_SUCCESS') {
location.reload();
}
});
controllerchange
на объекте navigator.serviceWorker
. Когда Service Worker сбрасывается и становится активным контроллером, будет вызвано событие controllerchange, и вы можете выполнить обновление страницы.navigator.serviceWorker.addEventListener('controllerchange', () => {
location.reload();
});