Team Messenger

Description

Team Messenger is a WordPress plugin that adds secure, real-time messaging for logged-in users. It includes one-to-one chats, group rooms, optional end-to-end encryption for private threads, media uploads with administrator-controlled policies, presence, notification badges, pinned messages, and dedicated interfaces on both the public site and in wp-admin.

Technical details and changelog notes may be published on the plugin support page or in the documentation as they are updated.

English — Numbered feature list

  1. Real-time direct messaging between logged-in WordPress users over the REST API (team_messenger/v1), including pagination for message history.

  2. Optional end-to-end encryption (E2E) for direct messages: clients can exchange messages flagged as encrypted, and public keys are stored per user through dedicated REST endpoints (/keys). Group chats remain readable on the server (plaintext on the server side).

  3. Full group-chat lifecycle: create, read, update, and delete groups; set a name, description, and group avatar; list members; add or remove members; and promote or demote roles with a PATCH request on members.

  4. Rich media in chats: image, video, and audio attachments, plus optional voice messages recorded in the browser (MediaRecorder, typically WebM/WebA) with server-side MIME handling for reliable uploads.

  5. Two upload contexts on /media/upload: chat for conversation attachments and avatar for group profile images. Each context has independent size and format rules, which the server enforces.

  6. Administrator-configurable media policy: separate maximum file sizes for chat (0.1–100 MB) and group avatars (0.1–50 MB); toggles for allowed chat categories (image / video / audio) and allowed avatar formats (for example JPEG, PNG, GIF, WebP). Limits are sent to the client as hints; the server performs the final validation.

  7. Flexible storage for uploaded files: attachments can live in the WordPress Media Library or in a plugin-protected directory (.htaccess where applicable). Private-path files are downloaded through an authenticated /media/download/{file} request.

  8. “Saved messages” (self-chat): a personal notebook thread in which the current user is both sides, for notes and files.

  9. Recent conversations: when no search query is sent, the user list prioritizes people you have messaged recently and does not expose the entire user directory.

  10. Privacy-conscious user search: at least three characters are required, and the number of results is capped.

  11. Presence (online / last seen): clients send a throttled heartbeat to POST /presence. The last_seen and is_online fields appear in user lists only when the viewer has shared direct-message history with that user or shares a group (privacy-preserving).

  12. Notifications: GET /notifications/counts returns separate counts and text previews for new personal and group activity since the last acknowledgment. POST /notifications/ack accepts a scope of all, personal, or group.

  13. WordPress admin bar integration: when the toolbar is visible, separate nodes show personal and group chat badges. Dropdowns load preview snippets (periodic polling) and allow clearing notifications by scope. Non-administrators link to the site home; users with manage_options can open the full messenger screen.

  14. Dashboard widgets (administrators): two WordPress Dashboard widgets—personal (1:1) and group—provide inline chat with the same REST capabilities as the main messenger (including pins and upload limits). They are visible only to users with manage_options who have not disabled admin chat.

  15. Pinned messages: one pin per direct thread (stored in team_messenger_direct_pins) and one per group (pinned_message_id). You can pin or unpin from the floating widget, [team_messenger_web_chat], the admin messenger, and the dashboard widgets. A pinned strip shows a snippet and scrolls to the message. Pins are cleared if the underlying message is deleted.

  16. Read state: opening a direct thread marks incoming messages from the partner as read (is_read). For groups, per-user last-read timestamps sync when the thread is opened. Your own outgoing group messages can show read receipts (“sent” vs “read”) when all other members have caught up.

  17. Message lifecycle: edit or soft-delete your own messages in direct and group threads (the API supports edit and delete on owned messages).

  18. Data retention: a daily scheduled event permanently removes soft-deleted direct and group messages whose deleted_at is older than 30 days (GDPR-oriented housekeeping).

  19. Multiple surfaces: a floating chat widget on the front end; a full-page [team_messenger_web_chat] shortcode with configurable HTML fallback for guests; a dedicated admin “Messenger” screen; an optional floating FAB on all wp-admin screens (toggle in settings, respects the per-user “hide admin chat” setting); admin bar badges; and two dashboard widgets for administrators.

  20. Customization in settings: primary accent color, widget corner placement, welcome text, shortcode guest content (visual/HTML editor), and a site-wide “show messenger on all wp-admin screens” option.

  21. Per-user preferences on the user profile: optionally hide front-end chat (widget and shortcode UI) and/or all wp-admin chat (floating messenger, full messenger page, admin bar nodes, and dashboard widgets). Shortcode pages show a short notice if frontend chat is disabled for that user.

  22. Abuse protection: rate limiting on sending messages and on creating groups, to reduce spam and overload.

  23. Internationalization: text domain team-messenger. Persian (fa_IR) and other translations can ship in the languages folder. English is the source language.

فارسی — فهرست شماره‌دار امکانات

۱. پیام‌رسانی مستقیم (یک‌به‌یک) بین کاربران واردشدهٔ وردپرس از طریق REST API با فضای نام team_messenger/v1 و صفحه‌بندی تاریخچهٔ پیام.

۲. رمزنگاری سرتاسری اختیاری برای گفتگوی خصوصی: می‌توان پیام را با پرچم رمزشده ذخیره کرد؛ کلیدهای عمومی از طریق endpointهای /keys ذخیره و بازیابی می‌شوند. در گفتگوی گروهی، متن روی سرور به‌صورت متن عادی قابل پردازش است.

۳. چرخهٔ کامل مدیریت چت گروهی: ایجاد، ویرایش و حذف گروه؛ تنظیم نام، توضیحات و آواتار گروه؛ فهرست اعضا؛ افزودن یا حذف عضو؛ و تغییر نقش با PATCH روی عضو.

۴. رسانهٔ غنی در گفتگو: تصویر، ویدیو و صوت؛ پیام صوتی با ضبط در مرورگر (معمولاً WebM/WebA) و نرمال‌سازی MIME در سمت سرور.

۵. دو زمینهٔ آپلود در /media/upload: chat برای پیوست گفتگو و avatar برای تصویر پروفایل گروه؛ هر کدام سقف حجم و فرمت مستقل دارند و اعتبارسنجی نهایی در سرور انجام می‌شود.

۶. سیاست رسانه از پنل مدیر: حداکثر حجم جداگانه برای چت (۰٫۱ تا ۱۰۰ مگابایت) و آواتار گروه (۰٫۱ تا ۵۰ مگابایت)؛ امکان روشن یا خاموش کردن دسته‌های مجاز چت و فرمت‌های مجاز آواتار. اعداد به‌صورت راهنما به کلاینت ارسال می‌شوند و تصمیم نهایی با سرور است.

۷. ذخیره‌سازی انعطاف‌پذیر: فایل‌ها می‌توانند در کتابخانهٔ رسانهٔ وردپرس یا در پوشهٔ محافظت‌شدهٔ افزونه (با .htaccess در صورت امکان) قرار بگیرند. برای مسیر اختصاصی، دانلود فقط از طریق /media/download/{file} و برای کاربر احراز هویت‌شده انجام می‌شود.

۸. «پیام‌های ذخیره‌شده» (چت با خود): فضای شخصی برای یادداشت و فایل که کاربر فعلی هر دو طرف گفتگو است.

۹. گفتگوهای اخیر: وقتی جستجویی ارسال نشده باشد، فهرست کاربران کسانی را در اولویت قرار می‌دهد که اخیراً با آن‌ها پیام رد و بدل کرده‌اید و کل دایرکتوری کاربران را نمایش نمی‌دهد.

۱۰. جستجوی کاربر با رعایت حریم خصوصی: حداقل سه کاراکتر لازم است و تعداد نتایج محدود است.

۱۱. حضور (آنلاین / آخرین فعالیت): کلاینت ضربان کنترل‌شده (throttled) به POST /presence می‌فرستد. فیلدهای last_seen و is_online فقط وقتی در فهرست کاربران دیده می‌شوند که بیننده سابقهٔ پیام خصوصی مشترک یا عضویت در یک گروه مشترک با آن کاربر داشته باشد.

۱۲. اعلان‌ها: GET /notifications/counts شمارنده و پیش‌نمایش متن فعالیت شخصی و گروهی را از زمان آخرین تأیید برمی‌گرداند. POST /notifications/ack محدودهٔ all، personal یا group را می‌پذیرد.

۱۳. یکپارچگی با نوار ابزار وردپرس: وقتی نوار ابزار نمایان است، دو گره جدا شمارندهٔ چت شخصی و گروهی را نشان می‌دهند. منوهای کشویی پیش‌نمایش را با polling دوره‌ای بارگذاری می‌کنند و امکان پاک‌سازی اعلان‌ها بر اساس محدوده را دارند. کاربران غیرمدیر به صفحهٔ خانه لینک می‌شوند؛ کاربران دارای manage_options می‌توانند به صفحهٔ کامل پیام‌رسان بروند.

۱۴. ویجت‌های پیشخوان (مدیران): دو ویجت جداگانه در پیشخوان وردپرس—گفتگوی شخصی (یک‌به‌یک) و گروهی—همان قابلیت‌های REST پیام‌رسان اصلی را دارند (از جمله پین و محدودیت آپلود). فقط برای کاربران دارای manage_options که چت مدیریت را غیرفعال نکرده‌اند نمایش داده می‌شوند.

۱۵. پیام پین‌شده: یک پین برای هر گفتگوی دونفره و یک پین برای هر گروه. پین و برداشتن پین از ویجت شناور، شورت‌کد [team_messenger_web_chat]، پیام‌رسان مدیریت و ویجت‌های پیشخوان امکان‌پذیر است. نوار پین تکه‌ای از متن را نشان می‌دهد و به پیام اسکرول می‌کند. اگر پیام اصلی حذف شود، پین نیز برداشته می‌شود.

۱۶. وضعیت خوانده‌شدن: با باز کردن گفتگوی خصوصی، پیام‌های ورودی طرف مقابل به‌صورت is_read علامت می‌خورند. در گروه، مهر زمانی آخرین بازدید هر کاربر همگام می‌شود. برای پیام‌های خروجی خودتان می‌توان رسید «همه خواندند» را وقتی سایر اعضا همگام شده‌اند نشان داد.

۱۷. چرخهٔ پیام: ویرایش یا حذف نرم پیام‌های خودتان در گفتگوی خصوصی و گروهی از طریق API.

۱۸. نگهداری داده: یک رویداد زمان‌بندی‌شدهٔ روزانه پیام‌های حذف‌شدهٔ نرم مستقیم و گروهی را که deleted_at آن‌ها قدیمی‌تر از ۳۰ روز است برای همیشه پاک می‌کند (خانه‌تکانی با رویکرد GDPR).

۱۹. چندین رابط: ویجت شناور در سایت؛ شورت‌کد تمام‌صفحهٔ [team_messenger_web_chat] با محتوای HTML قابل تنظیم برای مهمان؛ صفحهٔ اختصاصی «پیام‌رسان» در مدیریت؛ دکمهٔ شناور اختیاری در تمام صفحات wp-admin (تنظیم سراسری و احترام به خاموش بودن چت مدیریت برای هر کاربر)؛ نشان‌های نوار ابزار؛ و دو ویجت پیشخوان برای مدیران.

۲۰. شخصی‌سازی در تنظیمات: رنگ اصلی تأکید، محل گوشهٔ ویجت، متن خوش‌آمدگویی، محتوای مهمان شورت‌کد (ویرایشگر دیداری/HTML)، و گزینهٔ سراسری «نمایش پیام‌رسان در تمام صفحات wp-admin».

۲۱. ترجیحات هر کاربر در پروفایل: امکان پنهان کردن چت سایت (ویجت و رابط شورت‌کد) و/یا همهٔ چت wp-admin (پیام‌رسان شناور، صفحهٔ کامل پیام‌رسان، گره‌های نوار ابزار و ویجت‌های پیشخوان). اگر چت فرانت‌اند برای آن کاربر خاموش باشد، صفحهٔ شورت‌کد یک اعلان کوتاه نشان می‌دهد.

۲۲. محافظت در برابر سوءاستفاده: محدودیت نرخ ارسال پیام و ایجاد گروه برای کاهش هرزنامه و بار اضافی.

۲۳. چندزبانه: دامنهٔ متن team-messenger؛ ترجمه‌های فارسی (fa_IR) و سایر زبان‌ها می‌توانند از پوشهٔ languages عرضه شوند؛ زبان مبدأ متن‌ها انگلیسی است.

Installation

  1. Upload the plugin files to /wp-content/plugins/team-messenger, or install the ZIP from Plugins Add New.
  2. Activate the plugin from the Plugins screen.
  3. If needed, configure the options under the plugin’s Settings submenu.

FAQ

Does this work for guests?

The chat interface is for logged-in users. Shortcodes can display configurable fallback content for visitors.

Where are translations?

Language packs load automatically when the plugin is hosted on WordPress.org. The languages folder includes a .pot file and community .po files.

آیا برای مهمان‌ها چت فعال است؟

رابط چت مخصوص کاربران واردشده است. در شورت‌کد می‌توان محتوای جایگزین قابل تنظیم برای بازدیدکنندگان نمایش داد.

ترجمه‌ها کجاست؟

بسته‌های زبان هنگام میزبانی روی WordPress.org به‌صورت خودکار بارگذاری می‌شوند. فایل‌های ترجمه در پوشهٔ languages قرار دارند (.pot و .po جامعه)؛ برای fa_IR نیز پشتیبانی در نظر گرفته شده است.

Reviews

There are no reviews for this plugin.

Contributors & Developers

“Team Messenger” is open source software. The following people have contributed to this plugin.

Contributors

Translate “Team Messenger” into your language.

Interested in development?

Browse the code, check out the SVN repository, or subscribe to the development log by RSS.

Changelog

2.0.1

  • Compatibility: Confirmed with WordPress 7.1. The plugin directory “Tested up to” value is now 7.1.

2.0.0

  • Documentation: README.md and readme.txt wording polished in English and Persian, without removing existing features, FAQ items, or version history.
  • Chat UX: History scroll no longer snaps back to the latest message; Persian and other underscore locales (for example fa_IR) no longer break message rendering; sending a message no longer leaves the conversation.
  • Versioning: Major release for the completed 1.x feature set, now published as 2.0.0.

1.1.0

  • Access: Optional role restriction for who can use Team Messenger (the default remains all logged-in users). Enforced in REST and in all chat interfaces.
  • Security: Sending a message now rejects unknown recipients and attachments that were not uploaded through this plugin.
  • Privacy: User search no longer matches email addresses.
  • GDPR: Registered personal-data exporters and erasers. Uninstall now removes all plugin options, user meta, tables, cron events, and the private upload directory.
  • Translations: load_plugin_textdomain loads the bundled languages folder for local ZIP installs (including fa_IR).
  • Unread: Per-conversation unread counts for personal and group threads; opening a thread marks that thread as read. Admin-bar totals still work. The existing notification ack API is unchanged.
  • Notifications: Optional desktop (browser) notifications, gated by a widget setting and requested only after a user gesture.
  • Chat: Reply/quote on direct and group messages; in-conversation search; optional document attachments (PDF, Office, TXT, ZIP).

1.0.9

  • Fixed: Chat views no longer jump back to the latest message after 1–2 seconds when you scroll up to read history. Polling now keeps the current scroll position unless you were already near the bottom or just sent a message.
  • Fixed: Messages failed to render on WordPress locales that use underscore tags (for example fa_IR). JavaScript Intl APIs require BCP 47 tags (fa-IR). The plugin now converts the locale before calling toLocaleTimeString / toLocaleString, with a safe en-US fallback.
  • Fixed: Pressing Enter in the message field could submit a surrounding theme or WordPress form and leave the conversation. Enter is now stopped from bubbling so sending a message keeps the current chat open.

1.0.8

  • Security: Replaced the generic check_permission (logged-in only) on the /media/download/{file} REST endpoint with a dedicated check_media_download_permission callback that performs full ownership verification before serving any file. The check confirms the requesting user is either: (a) the sender or receiver of a direct message containing the file, (b) a member of a group whose group message contains the file, or (c) a member of the group whose avatar is that file. Site administrators (manage_options) retain access for moderation purposes. Non-matching requests receive a 403 response.

1.0.7

  • Fixed: Plugin URI updated to the correct public documentation page.
  • Fixed: Added plugin owner (syeedalireza) to the Contributors list in readme.txt.
  • Fixed: Removed remote CDN dependency for the Vazirmatn font (jsDelivr); all font files (woff2) are now bundled locally inside the plugin.
  • Fixed: Removed inline <style> block from the admin global chat partial; critical FAB styles are now output via wp_add_inline_style() attached to the enqueued stylesheet handle.
  • Fixed: Removed require_once wp-admin/includes/media.php that was included without any subsequent call to a function from that file, violating the core-file loading exception rule.
  • Fixed: Shortcode callback render_web_chat_shortcode now wraps the guest fallback output in wp_kses_post() after do_shortcode() execution to ensure all returned markup is properly escaped.
  • Verified: Plugin Check (PCP) reports no errors or warnings on a clean WordPress installation with WP_DEBUG enabled.

1.0.6

  • Maintenance and Plugin Check compliance improvements.