Files
wp-spaceapi-consumer/wp-api-consumer.php
2025-05-23 21:57:53 +01:00

163 lines
5.0 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* Plugin Name: Door Status Indicator
* Plugin URI: https://gitea.alluna.pt/jfig/wp-api-consumer
* Description: Lightweight, dependencyfree plugin that polls <https://nodered.jfig.net/api/v1/door-open>, caches the status for a few seconds, and shows a realtime door open/closed indicator (🟢/🔴) via [door_status] shortcode and the Admin Bar.
* Version: 1.1.0
* Author: Joao Figueiredo (ChatGPT helper)
* Author URI: https://jfig.net
* License: GPL v2 or later
* License URI: https://www.gnu.org/licenses/gpl-2.0.html
* Text Domain: door-status-indicator
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
/*
|--------------------------------------------------------------------------
| Configuration
|--------------------------------------------------------------------------
| Place environmentspecific constants inside door-status-config.php.
| They will be loaded automatically. If the file is missing we fall back to
| bundled defaults so the plugin keeps working outofthebox.
*/
$config_file = plugin_dir_path( __FILE__ ) . 'door-status-config.php';
if ( file_exists( $config_file ) ) {
require_once $config_file;
} else {
// Fallback defaults safe to adjust directly here if you prefer.
define( 'DSI_API_URL', 'https://nodered.jfig.net/api/v1/door-open' );
define( 'DSI_CACHE_KEY', 'dsi_door_open_status' );
define( 'DSI_CACHE_TTL', 10 );
}
/*
|--------------------------------------------------------------------------
| Core fetch & cache
|--------------------------------------------------------------------------
*/
/**
* Retrieves the dooropen status (boolean) with transient caching.
*
* @return bool True if open, false if closed.
*/
function dsi_get_status() : bool {
$cached = get_transient( DSI_CACHE_KEY );
if ( false !== $cached ) {
return (bool) $cached;
}
$response = wp_remote_get( DSI_API_URL, [
'timeout' => 3,
'user-agent' => 'DoorStatusIndicator/1.1 (+https://wordpress.org/)',
] );
if ( is_wp_error( $response ) ) {
// On error, assume closed and set a short transient to avoid hammering.
set_transient( DSI_CACHE_KEY, false, DSI_CACHE_TTL );
return false;
}
$body = wp_remote_retrieve_body( $response );
$decoded = json_decode( $body, true );
$status = false;
if ( is_bool( $decoded ) ) {
$status = $decoded;
} elseif ( is_array( $decoded ) && isset( $decoded['open'] ) ) {
$status = (bool) $decoded['open'];
}
set_transient( DSI_CACHE_KEY, $status, DSI_CACHE_TTL );
return $status;
}
/*
|--------------------------------------------------------------------------
| Shortcode [door_status]
|--------------------------------------------------------------------------
*/
/**
* Outputs a 🟢 or 🔴 indicator reflecting current door status.
* Usage: [door_status]
*
* @return string HTML span with coloured emoji.
*/
function dsi_shortcode() : string {
$open = dsi_get_status();
$emoji = $open ? '🟢' : '🔴';
return sprintf(
'<span class="door-status-indicator" aria-label="Door is %s">%s</span>',
$open ? 'open' : 'closed',
$emoji
);
}
add_shortcode( 'door_status', 'dsi_shortcode' );
/*
|--------------------------------------------------------------------------
| Admin Bar indicator
|--------------------------------------------------------------------------
*/
/**
* Adds a live indicator to the WordPress Admin Bar (front and backend).
*
* @param WP_Admin_Bar $wp_admin_bar The admin bar instance.
*/
function dsi_admin_bar( WP_Admin_Bar $wp_admin_bar ) : void {
if ( ! current_user_can( 'read' ) ) {
return; // Only show to loggedin users who can read.
}
$open = dsi_get_status();
$emoji = $open ? '🟢' : '🔴';
$text = $open ? __( 'Door Open', 'door-status-indicator' ) : __( 'Door Closed', 'door-status-indicator' );
$wp_admin_bar->add_node( [
'id' => 'door-status-indicator',
'title' => sprintf( '%s %s', $emoji, $text ),
'href' => '#',
'meta' => [
'title' => $text,
],
] );
}
add_action( 'admin_bar_menu', 'dsi_admin_bar', 1000 );
/*
|--------------------------------------------------------------------------
| Frontend inline CSS
|--------------------------------------------------------------------------
*/
function dsi_enqueue_assets() : void {
if ( is_admin() ) {
return;
}
$css = '.door-status-indicator{font-size:1.2em;line-height:1}';
wp_add_inline_style( 'wp-block-library', $css );
}
add_action( 'wp_enqueue_scripts', 'dsi_enqueue_assets' );
/*
|--------------------------------------------------------------------------
| WPCLI command (optional)
|--------------------------------------------------------------------------
*/
if ( defined( 'WP_CLI' ) && WP_CLI ) {
WP_CLI::add_command( 'door-status', function() {
$status = dsi_get_status() ? 'open 🟢' : 'closed 🔴';
WP_CLI::success( "Door is $status" );
} );
}
// End of file