{"id":248668,"date":"2025-09-01T08:16:37","date_gmt":"2025-09-01T08:16:37","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/init-chat-engine\/"},"modified":"2026-03-30T04:52:25","modified_gmt":"2026-03-30T04:52:25","slug":"init-chat-engine","status":"publish","type":"plugin","link":"https:\/\/szl.wordpress.org\/plugins\/init-chat-engine\/","author":14479633,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.3.3","stable_tag":"1.3.3","tested":"6.9.4","requires":"5.5","requires_php":"7.4","requires_plugins":null,"header_name":"Init Chat Engine","header_author":"Init HTML","header_description":"A lightweight, community-focused chat system built with REST API and Vanilla JS. Embed anywhere using the [init_chatbox] shortcode.","assets_banners_color":"39b3f8","last_updated":"2026-03-30 04:52:25","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/inithtml.com\/plugin\/init-chat-engine\/","header_author_uri":"https:\/\/inithtml.com\/","rating":0,"author_block_rating":0,"active_installs":40,"downloads":1402,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.1.6":{"tag":"1.1.6","author":"brokensmile.2103","date":"2025-09-01 08:31:03"},"1.1.7":{"tag":"1.1.7","author":"brokensmile.2103","date":"2025-09-13 11:20:42"},"1.1.8":{"tag":"1.1.8","author":"brokensmile.2103","date":"2025-09-13 14:57:02"},"1.1.9":{"tag":"1.1.9","author":"brokensmile.2103","date":"2025-10-01 03:09:10"},"1.2.0":{"tag":"1.2.0","author":"brokensmile.2103","date":"2025-10-02 06:50:04"},"1.2.1":{"tag":"1.2.1","author":"brokensmile.2103","date":"2025-10-07 13:34:20"},"1.2.2":{"tag":"1.2.2","author":"brokensmile.2103","date":"2025-10-07 14:52:10"},"1.2.3":{"tag":"1.2.3","author":"brokensmile.2103","date":"2025-10-14 15:39:20"},"1.2.4":{"tag":"1.2.4","author":"brokensmile.2103","date":"2025-10-18 03:25:17"},"1.2.5":{"tag":"1.2.5","author":"brokensmile.2103","date":"2025-10-18 08:22:09"},"1.2.6":{"tag":"1.2.6","author":"brokensmile.2103","date":"2025-10-29 14:28:45"},"1.2.7":{"tag":"1.2.7","author":"brokensmile.2103","date":"2025-11-10 02:52:18"},"1.2.8":{"tag":"1.2.8","author":"brokensmile.2103","date":"2025-11-11 05:27:09"},"1.2.9":{"tag":"1.2.9","author":"brokensmile.2103","date":"2026-02-13 02:10:24"},"1.3.0":{"tag":"1.3.0","author":"brokensmile.2103","date":"2026-03-02 13:35:12"},"1.3.1":{"tag":"1.3.1","author":"brokensmile.2103","date":"2026-03-26 04:20:31"},"1.3.2":{"tag":"1.3.2","author":"brokensmile.2103","date":"2026-03-30 03:53:44"},"1.3.3":{"tag":"1.3.3","author":"brokensmile.2103","date":"2026-03-30 04:52:25"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3353713,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3353713,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3353713,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3353713,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.1.6","1.1.7","1.1.8","1.1.9","1.2.0","1.2.1","1.2.2","1.2.3","1.2.4","1.2.5","1.2.6","1.2.7","1.2.8","1.2.9","1.3.0","1.3.1","1.3.2","1.3.3"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3353713,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3353713,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3353713,"resolution":"3","location":"assets","locale":""},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3353713,"resolution":"4","location":"assets","locale":""}},"screenshots":{"1":"Admin settings panel - Basic configuration","2":"Admin settings panel - Security and moderation","3":"Admin settings panel - Advanced options and maintenance","4":"Frontend chatbox interface with guest and user messages"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[5707,2316,4035,3518,80],"plugin_category":[41,43,44],"plugin_contributors":[242666],"plugin_business_model":[],"class_list":["post-248668","plugin","type-plugin","status-publish","hentry","plugin_tags-chat","plugin_tags-community","plugin_tags-lightweight","plugin_tags-realtime","plugin_tags-shortcode","plugin_category-communication","plugin_category-customization","plugin_category-discussion-and-community","plugin_contributors-brokensmile2103-1","plugin_committers-brokensmile2103-1"],"banners":{"banner":"https:\/\/ps.w.org\/init-chat-engine\/assets\/banner-772x250.png?rev=3353713","banner_2x":"https:\/\/ps.w.org\/init-chat-engine\/assets\/banner-1544x500.png?rev=3353713","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/init-chat-engine\/assets\/icon-128x128.png?rev=3353713","icon_2x":"https:\/\/ps.w.org\/init-chat-engine\/assets\/icon-256x256.png?rev=3353713","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/init-chat-engine\/assets\/screenshot-1.png?rev=3353713","caption":"Admin settings panel - Basic configuration"},{"src":"https:\/\/ps.w.org\/init-chat-engine\/assets\/screenshot-2.png?rev=3353713","caption":"Admin settings panel - Security and moderation"},{"src":"https:\/\/ps.w.org\/init-chat-engine\/assets\/screenshot-3.png?rev=3353713","caption":"Admin settings panel - Advanced options and maintenance"},{"src":"https:\/\/ps.w.org\/init-chat-engine\/assets\/screenshot-4.png?rev=3353713","caption":"Frontend chatbox interface with guest and user messages"}],"raw_content":"<!--section=description-->\n<p>Init Chat Engine is a clean and minimal frontend chatbox plugin, designed for homepage or site-wide communication with comprehensive administrative controls.<\/p>\n\n<p>This plugin is the core user system behind the <a href=\"https:\/\/en.inithtml.com\/init-plugin-suite-minimalist-powerful-and-free-wordpress-plugins\/\">Init Plugin Suite<\/a> \u2013 optimized for frontend-first interaction, extensibility, and real-time gamification.<\/p>\n\n<p>GitHub repository: <a href=\"https:\/\/github.com\/brokensmile2103\/init-chat-engine\">https:\/\/github.com\/brokensmile2103\/init-chat-engine<\/a><\/p>\n\n<p><strong>Key Features:<\/strong><\/p>\n\n<p><strong>Frontend Experience:<\/strong>\n- Built with 100% REST API and Vanilla JS\n- No jQuery, no bloat \u2013 blazing fast\n- Fully embeddable via <code>[init_chatbox]<\/code> shortcode\n- Guest messaging support (optional)\n- Smart polling system (adaptive 3.5\u201310s based on activity)\n- Browser notifications when new messages arrive\n- Scroll-up to load history, scroll-down to auto-scroll\n- Optimistic sending &amp; \"new message\" jump button\n- Clean UI with customizable themes\n- Template override supported (<code>chatbox.php<\/code>)<\/p>\n\n<p><strong>Administrative Control:<\/strong>\n- <strong>Complete Settings Panel<\/strong> - Basic, Security, and Advanced configurations\n- <strong>Message Management<\/strong> - Search, view, delete messages with pagination\n- <strong>User Moderation<\/strong> - Ban\/unban users by IP or user ID with expiration\n- <strong>Rate Limiting<\/strong> - Prevent spam with configurable message limits\n- <strong>Word Filtering<\/strong> - Block messages containing prohibited words\n- <strong>Statistics Dashboard<\/strong> - View chat activity, user engagement, and trends\n- <strong>Cleanup Tools<\/strong> - Automatic and manual cleanup of old messages\n- <strong>Custom CSS Support<\/strong> - Full styling customization options<\/p>\n\n<p><strong>Security &amp; Moderation:<\/strong>\n- IP-based and user-based banning system\n- Configurable rate limiting (messages per minute)\n- Word filtering with custom blocked word lists\n- Message moderation queue (optional)\n- Automatic cleanup of old messages and expired bans\n- Admin override capabilities<\/p>\n\n<p><strong>Multilingual Ready:<\/strong>\n- Translation-ready with full <code>.pot<\/code> file included\n- Vietnamese translation included\n- Easy to translate to any language<\/p>\n\n<p>Perfect for community-based sites, forums, fanpages, manga readers, SaaS dashboards, customer support, or any interactive chat widget.<\/p>\n\n<h3>Shortcode Attributes<\/h3>\n\n<p>Shortcode <code>[init_chatbox]<\/code> supports the following attributes:<\/p>\n\n<ul>\n<li><code>height<\/code> - Set chat height (e.g., <code>height=\"400px\"<\/code>)<\/li>\n<li><code>width<\/code> - Set chat width (e.g., <code>width=\"100%\"<\/code>)<\/li>\n<li><code>theme<\/code> - Apply custom theme (e.g., <code>theme=\"dark\"<\/code>)<\/li>\n<li><code>show_avatars<\/code> - Override avatar setting (<code>true<\/code>\/<code>false<\/code>)<\/li>\n<li><code>show_timestamps<\/code> - Override timestamp setting (<code>true<\/code>\/<code>false<\/code>)<\/li>\n<li><code>title<\/code> - Add custom chat title<\/li>\n<li><code>class<\/code> - Add custom CSS classes<\/li>\n<li><code>id<\/code> - Set custom container ID<\/li>\n<\/ul>\n\n<p>Example: <code>[init_chatbox height=\"500px\" title=\"Community Chat\" theme=\"modern\"]<\/code><\/p>\n\n<h3>Filters for Developers<\/h3>\n\n<p>This plugin provides filters and actions to allow developers to extend word filtering, message processing, and chat behavior without modifying core files.<\/p>\n\n<p><strong><code>init_plugin_suite_chat_engine_word_filter_strategy<\/code><\/strong><br \/>\nModify word filtering strategy (<code>substring<\/code>, <code>word<\/code>, <code>regex<\/code>).<br \/>\n<strong>Applies to:<\/strong> Message validation<br \/>\n<strong>Params:<\/strong> <code>string $strategy<\/code>, <code>array $settings<\/code>, <code>string $message<\/code><\/p>\n\n<p><strong><code>init_plugin_suite_chat_engine_blocked_words<\/code><\/strong><br \/>\nModify the blocked-words list before validation.<br \/>\n<strong>Applies to:<\/strong> Message validation<br \/>\n<strong>Params:<\/strong> <code>array $blocked_words<\/code>, <code>array $settings<\/code>, <code>string $message<\/code><\/p>\n\n<p><strong><code>init_plugin_suite_chat_engine_bypass_filter<\/code><\/strong><br \/>\nBypass filtering under custom conditions (VIP, internal users, etc.).<br \/>\n<strong>Applies to:<\/strong> Message validation<br \/>\n<strong>Params:<\/strong> <code>bool $bypass<\/code>, <code>string $message<\/code>, <code>WP_User|null $user<\/code>, <code>array $settings<\/code><\/p>\n\n<p><strong><code>init_plugin_suite_chat_engine_word_block_hit<\/code><\/strong> <em>(action)<\/em><br \/>\nTriggered when a word filter rule blocks a message.<br \/>\n<strong>Applies to:<\/strong> Message validation<br \/>\n<strong>Params:<\/strong> <code>string $blocked_word<\/code>, <code>string $message<\/code>, <code>string $strategy<\/code><\/p>\n\n<p><strong><code>init_plugin_suite_chat_engine_enrich_message_row<\/code><\/strong><br \/>\nExtend chat message data (add flags, metadata, user info, etc.).<br \/>\n<strong>Applies to:<\/strong> Backend DB \u2192 JSON output<br \/>\n<strong>Params:<\/strong> <code>array $message_row<\/code>, <code>WP_User|null $user<\/code><\/p>\n\n<h3>License<\/h3>\n\n<p>This plugin is licensed under the GPLv2 or later.<br \/>\nYou are free to use, modify, and distribute it under the same license.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to the <code>\/wp-content\/plugins\/<\/code> directory.<\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress.<\/li>\n<li>Configure settings under <code>Settings \u2192 Chat Engine<\/code>.<\/li>\n<li>Add the <code>[init_chatbox]<\/code> shortcode anywhere you want the chatbox to appear.<\/li>\n<li>Optional: Visit <code>Chat Engine \u2192 Management<\/code> to moderate messages and users.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"can%20guests%20send%20messages%3F\"><h3>Can guests send messages?<\/h3><\/dt>\n<dd><p>Yes, if enabled in the plugin settings under Basic Settings. Guests will be asked to enter a display name before sending messages.<\/p><\/dd>\n<dt id=\"how%20do%20i%20moderate%20messages%20and%20users%3F\"><h3>How do I moderate messages and users?<\/h3><\/dt>\n<dd><p>Go to <code>Chat Engine \u2192 Management<\/code> to view recent messages, ban\/unban users, and see chat statistics. You can search messages, delete inappropriate content, and ban users by IP or user account.<\/p><\/dd>\n<dt id=\"does%20it%20support%20real-time%20messaging%3F\"><h3>Does it support real-time messaging?<\/h3><\/dt>\n<dd><p>This plugin uses REST API with smart polling (3.5-10 second intervals) for broad compatibility. No WebSocket setup required, works on any hosting.<\/p><\/dd>\n<dt id=\"how%20many%20messages%20are%20stored%3F\"><h3>How many messages are stored?<\/h3><\/dt>\n<dd><p>Configurable in settings (default: 1000 messages). Old messages are automatically deleted when the limit is reached. You can also set up automatic cleanup based on age.<\/p><\/dd>\n<dt id=\"can%20i%20customize%20the%20chat%20appearance%3F\"><h3>Can I customize the chat appearance?<\/h3><\/dt>\n<dd><p>Yes, multiple ways:\n- Use the Custom CSS field in Advanced Settings\n- Override the template by placing <code>chatbox.php<\/code> in your theme's <code>init-chat-engine\/<\/code> folder\n- Use shortcode attributes for basic styling\n- Disable plugin CSS entirely and use your own<\/p><\/dd>\n<dt id=\"how%20does%20the%20ban%20system%20work%3F\"><h3>How does the ban system work?<\/h3><\/dt>\n<dd><p>Administrators can ban users by IP address or user account from the Management panel. Bans can be temporary (with expiration date) or permanent. Banned users see a clear message explaining their restriction.<\/p><\/dd>\n<dt id=\"can%20i%20limit%20message%20frequency%3F\"><h3>Can I limit message frequency?<\/h3><\/dt>\n<dd><p>Yes, use the Rate Limiting setting to control how many messages users can send per minute (1-100 messages). This helps prevent spam and abuse.<\/p><\/dd>\n<dt id=\"is%20it%20translation-ready%3F\"><h3>Is it translation-ready?<\/h3><\/dt>\n<dd><p>Yes, the plugin is fully translation-ready with Vietnamese translation included. All text strings use proper WordPress internationalization functions.<\/p><\/dd>\n<dt id=\"how%20do%20i%20backup%20chat%20data%3F\"><h3>How do I backup chat data?<\/h3><\/dt>\n<dd><p>Chat messages are stored in your WordPress database in the <code>wp_init_chatbox_msgs<\/code> table. Use any WordPress backup plugin or database backup tool.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.3.3 \u2013 March 30, 2026<\/h4>\n\n<ul>\n<li>Added expand\/collapse support for pinned message content in banner<\/li>\n<li>Allows viewing full pinned message without jumping to original message<\/li>\n<li>Stores full message content via <code>dataset<\/code> to avoid additional queries or requests<\/li>\n<li>Updated pinned banner to use absolute positioning to eliminate layout shift (CLS)<\/li>\n<li>Ensures stable layout when banner appears or updates<\/li>\n<li>Refined animation and interaction for smoother realtime UX<\/li>\n<li>No changes to API, database, or existing chat flow<\/li>\n<\/ul>\n\n<h4>1.3.2 \u2013 March 30, 2026<\/h4>\n\n<ul>\n<li>Introduced Pin Message feature for chat moderation (admin only)<\/li>\n<li>Allows pinning a single message to the top of the chat box (auto-replaces previous pin)<\/li>\n<li>Added hover-based Pin\/Unpin button on messages for admins with dynamic state handling<\/li>\n<li>Implemented pinned message banner with jump-to-message and highlight animation<\/li>\n<li>Added REST endpoints: POST \/pin and DELETE \/pin (nonce-verified, admin only)<\/li>\n<li><code>GET \/messages<\/code> now includes <code>pinned_message<\/code> for real-time sync across clients<\/li>\n<li>Pin state cached (5 minutes) with immediate invalidation on update<\/li>\n<li>Uses existing database (<code>init_chatbox_stats<\/code>) \u2014 no schema changes required<\/li>\n<li>Fully translation-ready via <code>InitChatEngineData.i18n<\/code><\/li>\n<li>Fully backwards-compatible and does not affect existing chat flow<\/li>\n<\/ul>\n\n<h4>1.3.1 \u2013 March 26, 2026<\/h4>\n\n<ul>\n<li>Performance optimization: added object caching for frequently called checks<\/li>\n<li><code>init_plugin_suite_chat_engine_has_messages()<\/code> now cached (24 hours) to reduce redundant DB queries during render<\/li>\n<li><code>init_plugin_suite_chat_engine_check_user_banned()<\/code> now uses 10-minute cache with multi-key strategy (user ID + IP)<\/li>\n<li>Implemented proper cache invalidation on ban\/unban actions to ensure real-time accuracy<\/li>\n<li>Added negative caching to eliminate repeated queries for non-banned users<\/li>\n<li>Internal optimization only \u2014 no UI or database changes<\/li>\n<li>Improves scalability and reduces database load under high traffic chat environments<\/li>\n<\/ul>\n\n<h4>1.3.0 \u2013 March 2, 2026<\/h4>\n\n<ul>\n<li>Introduced new <strong>Minimum Account Age Requirement<\/strong> (Security setting)<\/li>\n<li>Administrators can now require users to have an account older than <strong>X days<\/strong> before participating in chat<\/li>\n<li>Rule only applies when <strong>guest chatting is disabled<\/strong> (login required mode)<\/li>\n<li>Fully integrated across backend and frontend:\n\n<ul>\n<li>REST <code>\/send<\/code> endpoint now enforces account age validation via centralized security check<\/li>\n<li>Shared reusable function <code>init_plugin_suite_chat_engine_check_account_age_requirement()<\/code> ensures single source of truth<\/li>\n<\/ul><\/li>\n<li>Frontend UI enhancement:\n\n<ul>\n<li>Chat input is automatically disabled (<code>pointer-events: none; opacity: 0.6<\/code>) when account is too new<\/li>\n<li>Context-aware warning message displayed directly under the input area<\/li>\n<\/ul><\/li>\n<li>No impact on guest mode \u2014 public chats remain unaffected when guests are allowed<\/li>\n<li>Backwards-compatible with existing settings and database schema<\/li>\n<li>Security-focused enhancement to mitigate spam, clone accounts, and coordinated war activity<\/li>\n<\/ul>\n\n<h4>1.2.9 \u2013 February 13, 2026<\/h4>\n\n<ul>\n<li>Overhauled <strong>User Ban System<\/strong> with timezone-aware logic and optimized detection flow<\/li>\n<li>Fixed <strong>timezone inconsistency<\/strong> across ban creation, validation, and display layers\n\n<ul>\n<li><code>init_plugin_suite_chat_engine_ban_user()<\/code>: now uses <code>DateTime<\/code> with WordPress timezone for precise <code>expires_at<\/code> calculation<\/li>\n<li><code>init_plugin_suite_chat_engine_check_user_banned()<\/code>: replaced <code>NOW()<\/code> (GMT) with <code>current_time('mysql')<\/code> for accurate expiration checks<\/li>\n<li><code>init_plugin_suite_chat_engine_render_banned_message()<\/code>: switched to <code>date_i18n()<\/code> to prevent double timezone conversion<\/li>\n<\/ul><\/li>\n<li>Improved <strong>ban detection priority<\/strong> \u2014 user accounts are now checked first, IP fallback only when user is not banned\n\n<ul>\n<li>Prevents trivial IP-based bypass when logged-in users are banned<\/li>\n<li>Guest users (no <code>user_id<\/code>) continue to rely on IP-only detection<\/li>\n<\/ul><\/li>\n<li>Eliminated redundant dual-condition SQL queries (<code>user_id OR ip_address<\/code>) in favor of sequential checks<\/li>\n<li>Ban expiration timestamps now remain consistent across creation \u2192 validation \u2192 display (e.g., 48-hour ban created at 8:57 AM expires exactly at 8:57 AM, not 3:56 PM)<\/li>\n<li>Enhanced WP_DEBUG logging with detailed timestamp comparisons for admin troubleshooting<\/li>\n<li>Fully backwards-compatible with existing ban records and database schema<\/li>\n<li>Internal security hardening only; no UI or frontend behavioral changes<\/li>\n<\/ul>\n\n<h4>1.2.8 \u2013 November 11, 2025<\/h4>\n\n<ul>\n<li>Hotfix: fixed <strong>Load More (history pagination)<\/strong> message order becoming inconsistent\n\n<ul>\n<li><strong>API (<code>before_id<\/code>)<\/strong>: changed <code>ORDER BY id<\/code> from <strong>ASC \u2192 DESC<\/strong><\/li>\n<li><strong>Frontend (Load More)<\/strong>: removed <code>.reverse()<\/code>, now directly <code>prepend()<\/code> using API DESC order<\/li>\n<li><strong>Frontend (Initial load)<\/strong>: unchanged \u2014 reverse initial batch then <code>append()<\/code> (old \u2192 new)<\/li>\n<li><strong>Frontend (Realtime \/ after_id)<\/strong>: unchanged \u2014 API returns ASC, frontend <code>append()<\/code><\/li>\n<\/ul><\/li>\n<li>Result: timeline in the DOM remains strictly <strong>old \u2192 new<\/strong><\/li>\n<li>Minimal change \u2014 <strong>no DB schema changes, no UI changes<\/strong><\/li>\n<\/ul>\n\n<h4>1.2.7 \u2013 November 10, 2025<\/h4>\n\n<ul>\n<li>Fixed <strong>Load More \/ Pagination<\/strong> logic returning messages in reversed order<\/li>\n<li>API now consistently outputs messages in <strong>chronological ASC<\/strong> order across:\n\n<ul>\n<li>Initial load<\/li>\n<li>History pagination (<code>before_id<\/code>)<\/li>\n<li>Realtime polling (<code>after_id<\/code>)<\/li>\n<\/ul><\/li>\n<li>No frontend sorting required \u2014 FE only append\/prepend based on mode<\/li>\n<li>Ensures smooth timeline continuity when fetching older batches<\/li>\n<li>Internal change only; does <strong>not affect DB schema or UI behavior<\/strong><\/li>\n<\/ul>\n\n<h4>1.2.6 \u2013 October 20, 2025<\/h4>\n\n<ul>\n<li>Overhauled <strong>Word Filter Engine<\/strong> with hardened validation lifecycle<\/li>\n<li>Default strategy is now <strong>aggressive substring detection<\/strong> (catches <code>https:\/\/<\/code>, domains, encoded text, spam links, etc.)<\/li>\n<li>Fully respects existing Security settings:\n\n<ul>\n<li><code>Enable Word Filtering<\/code> toggle<\/li>\n<li><code>Blocked Words<\/code> textarea (one per line, supports Unicode)<\/li>\n<li><code>Word Filter Exceptions<\/code> (role-based whitelist: Administrators always bypass)<\/li>\n<\/ul><\/li>\n<li>Introduced new developer extension hooks (no new UI options):\n\n<ul>\n<li><code>init_plugin_suite_chat_engine_word_filter_strategy<\/code> \u2014 switch filter logic (<code>substring<\/code>, <code>word<\/code>, <code>regex<\/code>)<\/li>\n<li><code>init_plugin_suite_chat_engine_blocked_words<\/code> \u2014 modify blocked word list programmatically<\/li>\n<li><code>init_plugin_suite_chat_engine_bypass_filter<\/code> \u2014 bypass filtering based on custom logic (VIP, IP ranges, etc.)<\/li>\n<li><code>init_plugin_suite_chat_engine_word_block_hit<\/code> \u2014 event fired when a blocked word triggers<\/li>\n<\/ul><\/li>\n<li>Improved unicode normalization and internal cleanup of blocked-word lists (removes empty lines and <code>#comments<\/code>)<\/li>\n<li>Fully backwards-compatible \u2014 no disruption to existing settings or workflows<\/li>\n<li>Strengthened message security layer; prevents all major spam patterns (URL, Discord invite, Telegram link, obfuscated characters)<\/li>\n<\/ul>\n\n<h4>1.2.5 \u2013 October 18, 2025<\/h4>\n\n<ul>\n<li>Added new <strong>\u201cDelete All Messages\u201d<\/strong> button under <strong>Quick Actions<\/strong> in the management panel  <\/li>\n<li>Feature permanently removes all chat messages from the database with a single click  <\/li>\n<li>Protected by full security stack: admin-only capability, nonce verification, and SQL transaction safety  <\/li>\n<li>Resets all chat statistics (<code>total_messages<\/code>, <code>messages_today<\/code>, <code>active_users_today<\/code>, etc.) post-deletion  <\/li>\n<li>Includes detailed WP_DEBUG logging for admin audit trail (<code>who<\/code>, <code>when<\/code>)  <\/li>\n<li>UX-consistent with existing \u201cRun Cleanup Now\u201d button \u2014 executes instantly without JS dependency  <\/li>\n<li>Designed as a \u201cnuclear cleanup\u201d option for administrators managing public chat environments  <\/li>\n<li>No other functional or visual changes; this update focuses solely on administrative maintenance tools  <\/li>\n<\/ul>\n\n<h4>1.2.4 \u2013 October 18, 2025<\/h4>\n\n<ul>\n<li>Rebuilt <strong>FX Keyword Engine<\/strong> for per-message precision and zero-DOM overhead  <\/li>\n<li>Replaced global <code>TreeWalker<\/code> scanning with on-demand inline FX application during message render  <\/li>\n<li>Introduced new internal helpers: <code>getCompiledFXRules()<\/code> and <code>applyFXInMessageContainer()<\/code>  <\/li>\n<li>Rules are now compiled once and reused, ensuring stable performance even with large message histories  <\/li>\n<li>Removed redundant functions <code>initChatboxReplaceFXKeywords()<\/code>, <code>safeReplaceFXKeywordsInDOM()<\/code>, and <code>runFXIfHasMessages()<\/code>  <\/li>\n<li>Eliminated repeated DOM traversals after message batch rendering (initial load, polling, or history fetch)  <\/li>\n<li>Maintained full compatibility with external <code>runEffect()<\/code> logic and <code>FX_KEYWORDS<\/code> data structure  <\/li>\n<li>Improved keyword detection accuracy using unified regex alternation with named groups  <\/li>\n<li>Achieved significant runtime gains \u2014 messages now apply FX instantly upon creation  <\/li>\n<li>Internal optimization only; no visual or behavioral changes for end users  <\/li>\n<\/ul>\n\n<h4>1.2.3 \u2013 October 14, 2025<\/h4>\n\n<ul>\n<li>Added safe integration hook for cross-plugin Init FX Engine keyword replacement  <\/li>\n<li>Chat engine now auto-invokes external DOM keyword highlighter (<code>replaceFXKeywordsInDOM<\/code>) <strong>only when new messages are loaded<\/strong>  <\/li>\n<li>Added conditional wrapper with <code>typeof<\/code> check to prevent errors if the external plugin is not active  <\/li>\n<li>Introduced new internal helper: <code>safeRunFX()<\/code> for async idle execution (avoids blocking UI on message bursts)  <\/li>\n<li>Implemented new scoped function <code>initChatboxReplaceFXKeywords()<\/code> \u2014 optimized DOM scanning limited to <code>.init-chatbox-text<\/code> only  <\/li>\n<li>Rewrote FX keyword parser with <code>TreeWalker<\/code> for deep text traversal and regex stability  <\/li>\n<li>Eliminated duplicate link generation and ensured idempotent behavior (no double replacements)  <\/li>\n<li>Performance improved significantly when many messages are rendered or refreshed in batch  <\/li>\n<li>Internal enhancement only \u2014 no UI changes; improves plugin compatibility and runtime stability<\/li>\n<\/ul>\n\n<h4>1.2.2 \u2013 October 7, 2025<\/h4>\n\n<ul>\n<li><strong>Hotfix Release:<\/strong> removed redundant ban check inside <code>[init_chatbox]<\/code> shortcode  <\/li>\n<li>Eliminated secondary <code>init_plugin_suite_chat_engine_check_user_banned()<\/code> call (already handled by shortcode controller)  <\/li>\n<li>Prevented duplicate banned-message rendering and minor timezone mismatches  <\/li>\n<li>Simplified shortcode logic for better maintainability and consistency with ban middleware  <\/li>\n<li>No user-facing behavior change \u2014 internal backend cleanup only  <\/li>\n<\/ul>\n\n<h4>1.2.1 \u2013 October 7, 2025<\/h4>\n\n<ul>\n<li>Added role-based word filter exceptions in Security settings  <\/li>\n<li>New UI option: <strong>\u201cWord Filter Exceptions\u201d<\/strong> allows selecting user roles that can bypass blocked-word restrictions  <\/li>\n<li>Default exempt role: <strong>Administrator<\/strong> (others can be toggled via checkboxes)  <\/li>\n<li>Enhanced backend sanitization with strict role validation against existing WordPress roles  <\/li>\n<li>Updated message validation logic: users in exempt roles can send blocked words without triggering filter  <\/li>\n<li>Preserves security for guests and non-exempt roles (still subject to normal word filtering)  <\/li>\n<li>Improved localization: added Vietnamese translations for all new settings strings  <\/li>\n<\/ul>\n\n<h4>1.2.0 \u2013 October 2, 2025<\/h4>\n\n<ul>\n<li>Introduced new filter <code>init_plugin_suite_chat_engine_enrich_message_row<\/code> for extending message rows with custom user metadata  <\/li>\n<li>Enables themes\/plugins to attach extra flags (roles, VIP status, moderation rights, etc.) without touching core logic  <\/li>\n<li>Improves flexibility and forward-compatibility of the chat engine API, allowing richer integrations and UI features downstream  <\/li>\n<\/ul>\n\n<h4>1.1.9 \u2013 October 1, 2025<\/h4>\n\n<ul>\n<li>Added optional support for user profile links in chat messages<\/li>\n<li>Introduced <code>profile_url<\/code> field in API responses for registered users<\/li>\n<li>Provided frontend hook (<code>initChatEngineMessageElementHook<\/code>) to linkify display names if desired<\/li>\n<li>Feature is opt-in only; by default, names remain plain text for backward compatibility<\/li>\n<\/ul>\n\n<h4>1.1.8 \u2013 September 13, 2025<\/h4>\n\n<ul>\n<li>Hardened <code>\/send<\/code> security for logged-in users: strictly validate <code>X-WP-Nonce<\/code> and block cross-site POST attempts<\/li>\n<li>Sanitized inputs on the server before storage: apply <code>wp_strip_all_tags()<\/code> to both <code>message<\/code> and <code>display_name<\/code> (logged-in and guest paths)<\/li>\n<li>Rejected empty or non-visible messages: now fails fast on whitespace-\/zero-width-\/control-character\u2013only content<\/li>\n<li>Enforced length limits server-side (pre-insert) to prevent oversized payloads; behavior matches UI constraints<\/li>\n<li>Kept output defense-in-depth: responses continue to use <code>wp_kses_post()<\/code> for message rendering<\/li>\n<li>Tightened server-side anti-abuse: permission callback rate-limit check remains authoritative (in addition to any client throttling)<\/li>\n<\/ul>\n\n<h4>1.1.7 \u2013 September 13, 2025<\/h4>\n\n<ul>\n<li>Updated URL auto-linking logic to only apply when the link matches the current site domain<\/li>\n<li>Prevented external or mismatched-domain links from being auto-converted into <code>&lt;a&gt;<\/code> tags<\/li>\n<li>Reduced risk of spammy or malicious links being injected into formatted content<\/li>\n<li>Maintained full support for existing markdown-style text formatting features<\/li>\n<li>Improved overall content safety and formatting reliability<\/li>\n<\/ul>\n\n<h4>1.1.6 \u2013 September 1, 2025<\/h4>\n\n<ul>\n<li>Updated codebase to fully comply with WordPress Coding Standards (WPCS)<\/li>\n<li>Refactored inline documentation and formatting for better readability and maintainability<\/li>\n<li>Improved code consistency to align with official WordPress best practices<\/li>\n<li>Minor internal cleanups to enhance long-term stability<\/li>\n<\/ul>\n\n<h4>1.1.5 \u2013 August 4, 2025<\/h4>\n\n<ul>\n<li>Enhanced text formatting logic with smarter boundary detection for markdown-style syntax<\/li>\n<li>Improved formatting rules to require whitespace boundaries OR string start\/end positions<\/li>\n<li>Fixed formatting conflicts in code identifiers (e.g., <code>init_live_search<\/code> no longer formats \"live\")<\/li>\n<li>Resolved mathematical expression formatting issues (e.g., <code>1*2*3 = 6<\/code> no longer bolds \"2\")<\/li>\n<li>Updated regex patterns to use OR logic: format when either start OR end has whitespace boundary<\/li>\n<li>Enhanced support for edge cases like <code>*start* and *end*<\/code> now properly formats both words<\/li>\n<li>Maintained strict content validation: no spaces immediately after opening or before closing markers<\/li>\n<li>Added comprehensive capture group handling for multiple regex patterns<\/li>\n<li>Improved formatting accuracy while preserving backward compatibility<\/li>\n<li>Enhanced user experience with more intuitive and predictable text formatting behavior<\/li>\n<\/ul>\n\n<h4>1.1.4 \u2013 August 3, 2025<\/h4>\n\n<ul>\n<li>Added extensible hook system for enhanced message formatting and customization<\/li>\n<li>Introduced <code>window.initChatEngineFormatHook<\/code> for custom text formatting (supports sticker display and theme extensions)<\/li>\n<li>Added <code>window.initChatEngineMessageElementHook<\/code> for post-processing message elements after creation<\/li>\n<li>Enhanced message rendering pipeline to support external plugins and theme customizations<\/li>\n<li>Improved integration capabilities with Init Manga sticker system and other theme features<\/li>\n<li>Maintained backward compatibility while providing flexible extension points for developers<\/li>\n<li>Optimized hook execution with proper error handling to prevent chat interruptions<\/li>\n<\/ul>\n\n<h4>1.1.3 \u2013 August 01, 2025<\/h4>\n\n<ul>\n<li>Advanced request management system with AbortController to prevent duplicate API calls<\/li>\n<li>Real-time timestamp updates: message timestamps now refresh automatically (e.g., \"5 minutes\" \u2192 \"6 minutes\")<\/li>\n<li>Enhanced network error handling with exponential backoff and smart retry mechanism<\/li>\n<li>Improved connection stability for slow\/unstable networks with intelligent polling intervals<\/li>\n<li>Request deduplication system prevents message loading conflicts and UI inconsistencies<\/li>\n<li>Network status monitoring with automatic reconnection when connection is restored<\/li>\n<li>Better error recovery with consecutive error tracking and adaptive polling frequency<\/li>\n<li>Performance optimizations: reduced unnecessary API calls and improved memory management<\/li>\n<li>Enhanced user experience with clearer loading states and connection status indicators<\/li>\n<li>Robust offline\/online detection with proper fallback handling for network interruptions<\/li>\n<\/ul>\n\n<h4>1.1.2 \u2013 July 30, 2025<\/h4>\n\n<ul>\n<li>Complete dark mode system overhaul with comprehensive theme support<\/li>\n<li>Enhanced CSS variables system with dedicated light\/dark theme variable sets<\/li>\n<li>Full component coverage: dark mode now applies to all elements (messages, inputs, buttons, scrollbars, modals)<\/li>\n<li>Smart theme detection: auto-detect system dark mode preference with <code>@media (prefers-color-scheme: dark)<\/code><\/li>\n<li>Improved color contrast and accessibility with proper contrast ratios for dark theme<\/li>\n<li>Smooth theme transitions with 0.3s transition animations when switching between themes<\/li>\n<\/ul>\n\n<h4>1.1.1 \u2013 July 29, 2025<\/h4>\n\n<ul>\n<li>Resolved infinite scroll loop bug causing chat interface crashes<\/li>\n<li>Fixed load more button toggle conflicts in middle scroll positions (50-200px from top)<\/li>\n<li>Implemented debounced scroll handling with 100ms stabilization timer<\/li>\n<li>Added scroll direction tracking to prevent unnecessary auto-load triggers<\/li>\n<li>Improved scroll zone boundaries: auto-load (&lt;30px), manual button (30-200px), hide (&gt;300px)<\/li>\n<li>Enhanced state management to prevent redundant UI updates and layout thrashing<\/li>\n<li>Added proper timer cleanup on page unload to prevent memory leaks<\/li>\n<li>Optimized scroll performance with passive event listeners and reduced DOM queries<\/li>\n<li>Fixed scroll button visibility logic to prevent flickering during rapid scrolling<\/li>\n<li>Strengthened error handling for edge cases in scroll position calculations<\/li>\n<li>Added support for utility classes (uk-hidden, hidden, .ice-hidden)<\/li>\n<li>Automatic CSS framework detection and appropriate hide\/show class usage<\/li>\n<li>Fixed character counter not working for guest users due to duplicate ID names<\/li>\n<li>Improved \"Load more\" button display logic to be more generous but still safe (expanded zone to 400px)<\/li>\n<li>Faster UI response time: reduced debounce to 80ms, auto-load delay to 150ms<\/li>\n<\/ul>\n\n<h4>1.1.0 \u2013 July 29, 2025<\/h4>\n\n<ul>\n<li>Major admin panel upgrade with tabbed interface (Basic, Security, Advanced)<\/li>\n<li>Added full message management system with search and pagination<\/li>\n<li>Introduced user ban\/unban system with support for IP and user restrictions<\/li>\n<li>Built statistics dashboard with activity charts and engagement metrics<\/li>\n<li>Implemented rate limiting control (messages per minute) to prevent spam<\/li>\n<li>Added word filter system with custom blocked word list<\/li>\n<li>Included auto\/manual cleanup tools for old messages<\/li>\n<li>Redesigned admin UI with professional styling and responsive support<\/li>\n<li>Added connection status indicators and improved error handling<\/li>\n<li>Introduced REST API endpoints for admin moderation actions<\/li>\n<li>Implemented caching and nonce verification for all admin operations<\/li>\n<li>Added full settings validation and sanitization<\/li>\n<li>Full i18n support with .pot file and Vietnamese translation included<\/li>\n<\/ul>\n\n<h4>1.0.3 \u2013 July 20, 2025<\/h4>\n\n<ul>\n<li>Added support for inline message formatting: <code>*bold*<\/code>, <code>_highlight_<\/code>, <code>~strike~<\/code>, <code>^mark^<\/code>, and <code>italic<\/code><\/li>\n<li>Reused highlight style <code>.init-fx-highlight-text<\/code> from Init FX Engine (no duplicated CSS)<\/li>\n<li>Improved message rendering with safe HTML output<\/li>\n<li>Removed redundant <code>escapeHTML()<\/code> call to enable formatting<\/li>\n<li>Minor refactor of formatting logic<\/li>\n<\/ul>\n\n<h4>1.0.2 \u2013 July 19, 2025<\/h4>\n\n<ul>\n<li>Added user avatar rendering with fallback support<\/li>\n<li>Introduced blinking document title when new messages arrive<\/li>\n<li>Added anti-spam cooldown and click-lock on send button<\/li>\n<li>Refined guest name workflow and improved avatar integration<\/li>\n<li>Enhanced message HTML structure and cleaned up code<\/li>\n<\/ul>\n\n<h4>1.0.1 \u2013 July 19, 2025<\/h4>\n\n<ul>\n<li>Implemented smart polling system with adaptive intervals<\/li>\n<li>Added browser notification API support for new messages<\/li>\n<li>Improved scroll behavior and scroll-to-bottom logic<\/li>\n<li>Enhanced typing state detection and guest name handling<\/li>\n<li>Fixed message prepending offset issue and made UI tweaks<\/li>\n<\/ul>\n\n<h4>1.0.0 \u2013 July 18, 2025<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>Core chat functionality using REST API (no WebSocket)<\/li>\n<li>Guest messaging support with basic identity system<\/li>\n<li>Admin settings for message limits and guest permissions<\/li>\n<li>Shortcode support with template override<\/li>\n<li>Scrollable history with smooth auto-scroll<\/li>\n<li>Optimistic message sending with fallback retry<\/li>\n<\/ul>","raw_excerpt":"A lightweight, real-time community chat system built with REST API and Vanilla JS. No jQuery, no reload. Full admin panel with moderation tools.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/248668","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=248668"}],"author":[{"embeddable":true,"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/brokensmile2103-1"}],"wp:attachment":[{"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=248668"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=248668"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=248668"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=248668"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=248668"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=248668"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}