diff --git a/.mokogitea/manifest.xml b/.mokogitea/manifest.xml index 12c4841..eb96ba8 100644 --- a/.mokogitea/manifest.xml +++ b/.mokogitea/manifest.xml @@ -5,7 +5,7 @@ Package - MokoSuiteCross MokoConsulting Cross-posting Joomla content to social media, email marketing, and chat platforms - 01.03.00 + 01.03.01 GNU General Public License v3 diff --git a/.mokogitea/workflows/issue-branch.yml b/.mokogitea/workflows/issue-branch.yml index 0f55bd3..3a6c90d 100644 --- a/.mokogitea/workflows/issue-branch.yml +++ b/.mokogitea/workflows/issue-branch.yml @@ -5,7 +5,7 @@ # FILE INFORMATION # DEFGROUP: Gitea.Workflow # INGROUP: mokoplatform.Automation -# VERSION: 01.03.00 +# VERSION: 01.03.01 # BRIEF: Auto-create feature branch when an issue is opened name: "Universal: Issue Branch" diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e206ea..1f00558 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,11 +2,14 @@ ## [Unreleased] +### Fixed +- **Package manifest**: Added missing `plg_system_mokosuitecross_events` and `plg_system_mokosuitecross_gallery` to `pkg_mokosuitecross.xml` — these system plugins were not installed with the package +- **Cleanup**: Removed old `src/` directory (pre-rename cruft with `mokojoomcross` files) ## [01.03.00] --- 2026-06-21 - + All notable changes to MokoSuiteCross will be documented in this file. diff --git a/README.md b/README.md index db8936f..f0d7e31 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # MokoSuiteCross - + Cross-posting Joomla content to social media, email marketing, and chat platforms for Joomla 5/6. diff --git a/source/packages/com_mokosuitecross/mokosuitecross.xml b/source/packages/com_mokosuitecross/mokosuitecross.xml index e3fdcaa..7b0c573 100644 --- a/source/packages/com_mokosuitecross/mokosuitecross.xml +++ b/source/packages/com_mokosuitecross/mokosuitecross.xml @@ -1,7 +1,7 @@ com_mokosuitecross - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_content_mokosuitecross/mokosuitecross.xml b/source/packages/plg_content_mokosuitecross/mokosuitecross.xml index e674e9f..168c1e4 100644 --- a/source/packages/plg_content_mokosuitecross/mokosuitecross.xml +++ b/source/packages/plg_content_mokosuitecross/mokosuitecross.xml @@ -1,7 +1,7 @@ Content - MokoSuiteCross - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_activitypub/activitypub.xml b/source/packages/plg_mokosuitecross_activitypub/activitypub.xml index f38542d..b5d2c44 100644 --- a/source/packages/plg_mokosuitecross_activitypub/activitypub.xml +++ b/source/packages/plg_mokosuitecross_activitypub/activitypub.xml @@ -1,7 +1,7 @@ MokoSuiteCross - ActivityPub (Fediverse) - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_blogger/blogger.xml b/source/packages/plg_mokosuitecross_blogger/blogger.xml index e966908..bdc3eb6 100644 --- a/source/packages/plg_mokosuitecross_blogger/blogger.xml +++ b/source/packages/plg_mokosuitecross_blogger/blogger.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Google Blogger - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_bluesky/bluesky.xml b/source/packages/plg_mokosuitecross_bluesky/bluesky.xml index f4171ba..cd7e0a6 100644 --- a/source/packages/plg_mokosuitecross_bluesky/bluesky.xml +++ b/source/packages/plg_mokosuitecross_bluesky/bluesky.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Bluesky - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_brevo/brevo.xml b/source/packages/plg_mokosuitecross_brevo/brevo.xml index 5f0edde..d0871ee 100644 --- a/source/packages/plg_mokosuitecross_brevo/brevo.xml +++ b/source/packages/plg_mokosuitecross_brevo/brevo.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Brevo (Sendinblue) - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_constantcontact/constantcontact.xml b/source/packages/plg_mokosuitecross_constantcontact/constantcontact.xml index 21d2acb..450e524 100644 --- a/source/packages/plg_mokosuitecross_constantcontact/constantcontact.xml +++ b/source/packages/plg_mokosuitecross_constantcontact/constantcontact.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Constant Contact - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_convertkit/convertkit.xml b/source/packages/plg_mokosuitecross_convertkit/convertkit.xml index 51c3dfe..40d5465 100644 --- a/source/packages/plg_mokosuitecross_convertkit/convertkit.xml +++ b/source/packages/plg_mokosuitecross_convertkit/convertkit.xml @@ -1,7 +1,7 @@ MokoSuiteCross - ConvertKit - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_devto/devto.xml b/source/packages/plg_mokosuitecross_devto/devto.xml index e6d9f49..ee540d9 100644 --- a/source/packages/plg_mokosuitecross_devto/devto.xml +++ b/source/packages/plg_mokosuitecross_devto/devto.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Dev.to - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_discord/discord.xml b/source/packages/plg_mokosuitecross_discord/discord.xml index f4d515d..504a619 100644 --- a/source/packages/plg_mokosuitecross_discord/discord.xml +++ b/source/packages/plg_mokosuitecross_discord/discord.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Discord - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_facebook/facebook.xml b/source/packages/plg_mokosuitecross_facebook/facebook.xml index 598cb18..ae594a5 100644 --- a/source/packages/plg_mokosuitecross_facebook/facebook.xml +++ b/source/packages/plg_mokosuitecross_facebook/facebook.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Facebook / Meta - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_ghost/ghost.xml b/source/packages/plg_mokosuitecross_ghost/ghost.xml index f781312..cb3d0b6 100644 --- a/source/packages/plg_mokosuitecross_ghost/ghost.xml +++ b/source/packages/plg_mokosuitecross_ghost/ghost.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Ghost - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_googlebusiness/googlebusiness.xml b/source/packages/plg_mokosuitecross_googlebusiness/googlebusiness.xml index 0c844ae..3ca721b 100644 --- a/source/packages/plg_mokosuitecross_googlebusiness/googlebusiness.xml +++ b/source/packages/plg_mokosuitecross_googlebusiness/googlebusiness.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Google Business Profile - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_googlechat/googlechat.xml b/source/packages/plg_mokosuitecross_googlechat/googlechat.xml index e2bea1d..68febbb 100644 --- a/source/packages/plg_mokosuitecross_googlechat/googlechat.xml +++ b/source/packages/plg_mokosuitecross_googlechat/googlechat.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Google Chat - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_hashnode/hashnode.xml b/source/packages/plg_mokosuitecross_hashnode/hashnode.xml index 214ee85..e8aca68 100644 --- a/source/packages/plg_mokosuitecross_hashnode/hashnode.xml +++ b/source/packages/plg_mokosuitecross_hashnode/hashnode.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Hashnode - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_linkedin/linkedin.xml b/source/packages/plg_mokosuitecross_linkedin/linkedin.xml index 4eb5f43..e71b597 100644 --- a/source/packages/plg_mokosuitecross_linkedin/linkedin.xml +++ b/source/packages/plg_mokosuitecross_linkedin/linkedin.xml @@ -1,7 +1,7 @@ MokoSuiteCross - LinkedIn - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_mailchimp/mailchimp.xml b/source/packages/plg_mokosuitecross_mailchimp/mailchimp.xml index b8feca5..bf41713 100644 --- a/source/packages/plg_mokosuitecross_mailchimp/mailchimp.xml +++ b/source/packages/plg_mokosuitecross_mailchimp/mailchimp.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Mailchimp - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_mastodon/mastodon.xml b/source/packages/plg_mokosuitecross_mastodon/mastodon.xml index 215a67d..41b6643 100644 --- a/source/packages/plg_mokosuitecross_mastodon/mastodon.xml +++ b/source/packages/plg_mokosuitecross_mastodon/mastodon.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Mastodon - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_matrix/matrix.xml b/source/packages/plg_mokosuitecross_matrix/matrix.xml index 2a11148..d721086 100644 --- a/source/packages/plg_mokosuitecross_matrix/matrix.xml +++ b/source/packages/plg_mokosuitecross_matrix/matrix.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Matrix / Element - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_medium/medium.xml b/source/packages/plg_mokosuitecross_medium/medium.xml index 622210c..829fa04 100644 --- a/source/packages/plg_mokosuitecross_medium/medium.xml +++ b/source/packages/plg_mokosuitecross_medium/medium.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Medium - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_mokosuitecalendar/mokosuitecalendar.xml b/source/packages/plg_mokosuitecross_mokosuitecalendar/mokosuitecalendar.xml index c8f1dc8..cb7cfad 100644 --- a/source/packages/plg_mokosuitecross_mokosuitecalendar/mokosuitecalendar.xml +++ b/source/packages/plg_mokosuitecross_mokosuitecalendar/mokosuitecalendar.xml @@ -1,7 +1,7 @@ MokoSuiteCross - MokoSuiteCalendar Events - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_mokosuitegallery/mokosuitegallery.xml b/source/packages/plg_mokosuitecross_mokosuitegallery/mokosuitegallery.xml index 16a790c..48119be 100644 --- a/source/packages/plg_mokosuitecross_mokosuitegallery/mokosuitegallery.xml +++ b/source/packages/plg_mokosuitecross_mokosuitegallery/mokosuitegallery.xml @@ -1,7 +1,7 @@ MokoSuiteCross - MokoSuiteGallery - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_nostr/nostr.xml b/source/packages/plg_mokosuitecross_nostr/nostr.xml index 28dc5a9..bfc31a9 100644 --- a/source/packages/plg_mokosuitecross_nostr/nostr.xml +++ b/source/packages/plg_mokosuitecross_nostr/nostr.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Nostr - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_ntfy/ntfy.xml b/source/packages/plg_mokosuitecross_ntfy/ntfy.xml index 44d0106..c65d7ed 100644 --- a/source/packages/plg_mokosuitecross_ntfy/ntfy.xml +++ b/source/packages/plg_mokosuitecross_ntfy/ntfy.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Ntfy Push Notifications - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_pinterest/pinterest.xml b/source/packages/plg_mokosuitecross_pinterest/pinterest.xml index 0b2479d..e15150a 100644 --- a/source/packages/plg_mokosuitecross_pinterest/pinterest.xml +++ b/source/packages/plg_mokosuitecross_pinterest/pinterest.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Pinterest - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_reddit/reddit.xml b/source/packages/plg_mokosuitecross_reddit/reddit.xml index a6d3a78..9de00ae 100644 --- a/source/packages/plg_mokosuitecross_reddit/reddit.xml +++ b/source/packages/plg_mokosuitecross_reddit/reddit.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Reddit - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_rssfeed/rssfeed.xml b/source/packages/plg_mokosuitecross_rssfeed/rssfeed.xml index 0d45755..b5ff637 100644 --- a/source/packages/plg_mokosuitecross_rssfeed/rssfeed.xml +++ b/source/packages/plg_mokosuitecross_rssfeed/rssfeed.xml @@ -1,7 +1,7 @@ MokoSuiteCross - RSS Feed - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_sendgrid/sendgrid.xml b/source/packages/plg_mokosuitecross_sendgrid/sendgrid.xml index e07b576..a064375 100644 --- a/source/packages/plg_mokosuitecross_sendgrid/sendgrid.xml +++ b/source/packages/plg_mokosuitecross_sendgrid/sendgrid.xml @@ -1,7 +1,7 @@ MokoSuiteCross - SendGrid - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_slack/slack.xml b/source/packages/plg_mokosuitecross_slack/slack.xml index b87930e..49f1111 100644 --- a/source/packages/plg_mokosuitecross_slack/slack.xml +++ b/source/packages/plg_mokosuitecross_slack/slack.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Slack - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_teams/teams.xml b/source/packages/plg_mokosuitecross_teams/teams.xml index cb7de12..80e5579 100644 --- a/source/packages/plg_mokosuitecross_teams/teams.xml +++ b/source/packages/plg_mokosuitecross_teams/teams.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Microsoft Teams - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_telegram/telegram.xml b/source/packages/plg_mokosuitecross_telegram/telegram.xml index a6a2137..544a862 100644 --- a/source/packages/plg_mokosuitecross_telegram/telegram.xml +++ b/source/packages/plg_mokosuitecross_telegram/telegram.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Telegram - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_threads/threads.xml b/source/packages/plg_mokosuitecross_threads/threads.xml index 9f7c98f..6dd456e 100644 --- a/source/packages/plg_mokosuitecross_threads/threads.xml +++ b/source/packages/plg_mokosuitecross_threads/threads.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Threads (Meta) - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_tiktok/tiktok.xml b/source/packages/plg_mokosuitecross_tiktok/tiktok.xml index 989976b..e3886e4 100644 --- a/source/packages/plg_mokosuitecross_tiktok/tiktok.xml +++ b/source/packages/plg_mokosuitecross_tiktok/tiktok.xml @@ -1,7 +1,7 @@ MokoSuiteCross - TikTok - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_tumblr/tumblr.xml b/source/packages/plg_mokosuitecross_tumblr/tumblr.xml index e4440dc..d0c63ab 100644 --- a/source/packages/plg_mokosuitecross_tumblr/tumblr.xml +++ b/source/packages/plg_mokosuitecross_tumblr/tumblr.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Tumblr - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_twitter/twitter.xml b/source/packages/plg_mokosuitecross_twitter/twitter.xml index 542b50f..3144258 100644 --- a/source/packages/plg_mokosuitecross_twitter/twitter.xml +++ b/source/packages/plg_mokosuitecross_twitter/twitter.xml @@ -1,7 +1,7 @@ MokoSuiteCross - X / Twitter - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_webhook/webhook.xml b/source/packages/plg_mokosuitecross_webhook/webhook.xml index 20edca5..0bcc82d 100644 --- a/source/packages/plg_mokosuitecross_webhook/webhook.xml +++ b/source/packages/plg_mokosuitecross_webhook/webhook.xml @@ -1,7 +1,7 @@ MokoSuiteCross - Generic Webhook - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_whatsapp/whatsapp.xml b/source/packages/plg_mokosuitecross_whatsapp/whatsapp.xml index ea0c09f..ced5ee8 100644 --- a/source/packages/plg_mokosuitecross_whatsapp/whatsapp.xml +++ b/source/packages/plg_mokosuitecross_whatsapp/whatsapp.xml @@ -1,7 +1,7 @@ MokoSuiteCross - WhatsApp Business - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_mokosuitecross_wordpress/wordpress.xml b/source/packages/plg_mokosuitecross_wordpress/wordpress.xml index 3087fe5..9c6a465 100644 --- a/source/packages/plg_mokosuitecross_wordpress/wordpress.xml +++ b/source/packages/plg_mokosuitecross_wordpress/wordpress.xml @@ -1,7 +1,7 @@ MokoSuiteCross - WordPress - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_system_mokosuitecross/mokosuitecross.xml b/source/packages/plg_system_mokosuitecross/mokosuitecross.xml index 1f4e4fd..e760817 100644 --- a/source/packages/plg_system_mokosuitecross/mokosuitecross.xml +++ b/source/packages/plg_system_mokosuitecross/mokosuitecross.xml @@ -1,7 +1,7 @@ System - MokoSuiteCross - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_system_mokosuitecross_events/mokosuitecross_events.xml b/source/packages/plg_system_mokosuitecross_events/mokosuitecross_events.xml index 8bb1610..5506096 100644 --- a/source/packages/plg_system_mokosuitecross_events/mokosuitecross_events.xml +++ b/source/packages/plg_system_mokosuitecross_events/mokosuitecross_events.xml @@ -1,7 +1,7 @@ System - MokoSuiteCross Events - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_system_mokosuitecross_gallery/mokosuitecross_gallery.xml b/source/packages/plg_system_mokosuitecross_gallery/mokosuitecross_gallery.xml index 7e11efc..1c4fa8e 100644 --- a/source/packages/plg_system_mokosuitecross_gallery/mokosuitecross_gallery.xml +++ b/source/packages/plg_system_mokosuitecross_gallery/mokosuitecross_gallery.xml @@ -1,7 +1,7 @@ System - MokoSuiteCross Gallery - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_task_mokosuitecross/mokosuitecross.xml b/source/packages/plg_task_mokosuitecross/mokosuitecross.xml index faba336..1c95b30 100644 --- a/source/packages/plg_task_mokosuitecross/mokosuitecross.xml +++ b/source/packages/plg_task_mokosuitecross/mokosuitecross.xml @@ -1,7 +1,7 @@ Task - MokoSuiteCross Queue Processor - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/packages/plg_webservices_mokosuitecross/mokosuitecross.xml b/source/packages/plg_webservices_mokosuitecross/mokosuitecross.xml index f2c584b..184f341 100644 --- a/source/packages/plg_webservices_mokosuitecross/mokosuitecross.xml +++ b/source/packages/plg_webservices_mokosuitecross/mokosuitecross.xml @@ -1,7 +1,7 @@ Web Services - MokoSuiteCross - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech diff --git a/source/pkg_mokosuitecross.xml b/source/pkg_mokosuitecross.xml index be51ac5..f0bbe35 100644 --- a/source/pkg_mokosuitecross.xml +++ b/source/pkg_mokosuitecross.xml @@ -2,7 +2,7 @@ MokoSuiteCross mokosuitecross - 01.03.00 + 01.03.01-dev 2026-05-28 Moko Consulting hello@mokoconsulting.tech @@ -60,6 +60,10 @@ plg_mokosuitecross_tiktok.zip plg_mokosuitecross_mokosuitecalendar.zip plg_mokosuitecross_mokosuitegallery.zip + + + plg_system_mokosuitecross_events.zip + plg_system_mokosuitecross_gallery.zip diff --git a/src/index.html b/src/index.html deleted file mode 100644 index 6182993..0000000 --- a/src/index.html +++ /dev/null @@ -1 +0,0 @@ -<\!DOCTYPE html> diff --git a/src/language/en-GB/index.html b/src/language/en-GB/index.html deleted file mode 100644 index 6182993..0000000 --- a/src/language/en-GB/index.html +++ /dev/null @@ -1 +0,0 @@ -<\!DOCTYPE html> diff --git a/src/language/index.html b/src/language/index.html deleted file mode 100644 index 6182993..0000000 --- a/src/language/index.html +++ /dev/null @@ -1 +0,0 @@ -<\!DOCTYPE html> diff --git a/src/packages/com_mokojoomcross/config.xml b/src/packages/com_mokojoomcross/config.xml deleted file mode 100644 index fa5dfa3..0000000 --- a/src/packages/com_mokojoomcross/config.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - JYES - JNO - - - - - - - - - - - diff --git a/src/packages/com_mokojoomcross/language/en-GB/com_mokojoomcross.ini b/src/packages/com_mokojoomcross/language/en-GB/com_mokojoomcross.ini deleted file mode 100644 index 548df81..0000000 --- a/src/packages/com_mokojoomcross/language/en-GB/com_mokojoomcross.ini +++ /dev/null @@ -1,60 +0,0 @@ -; MokoJoomCross — Admin Backend Language File -; Copyright (C) 2026 Moko Consulting. All rights reserved. -; License: GPL-3.0-or-later - -COM_MOKOJOOMCROSS="MokoJoomCross" -COM_MOKOJOOMCROSS_DESCRIPTION="Cross-posting Joomla content to social media, email marketing, and chat platforms" - -; Submenu -COM_MOKOJOOMCROSS_SUBMENU_DASHBOARD="Dashboard" -COM_MOKOJOOMCROSS_SUBMENU_POSTS="Post Queue" -COM_MOKOJOOMCROSS_SUBMENU_SERVICES="Services" -COM_MOKOJOOMCROSS_SUBMENU_LOGS="Activity Logs" - -; Dashboard -COM_MOKOJOOMCROSS_DASHBOARD_ACTIVE_SERVICES="Active Services" -COM_MOKOJOOMCROSS_DASHBOARD_QUEUED="Queued" -COM_MOKOJOOMCROSS_DASHBOARD_POSTED="Posted" -COM_MOKOJOOMCROSS_DASHBOARD_FAILED="Failed" -COM_MOKOJOOMCROSS_DASHBOARD_QUICK_LINKS="Quick Links" - -; Migration -COM_MOKOJOOMCROSS_MIGRATION_TITLE="Migrate from Perfect Publisher Pro" -COM_MOKOJOOMCROSS_MIGRATION_DESCRIPTION="We detected Perfect Publisher Pro settings. Import your service configurations to MokoJoomCross." -COM_MOKOJOOMCROSS_MIGRATION_BUTTON="Start Migration" -COM_MOKOJOOMCROSS_MIGRATION_SUCCESS="Migration complete: %d service(s) imported, %d skipped." -COM_MOKOJOOMCROSS_MIGRATION_ERROR="Migration encountered errors: %s" - -; Services -COM_MOKOJOOMCROSS_FIELD_SERVICE_TYPE="Service Type" -COM_MOKOJOOMCROSS_SELECT_SERVICE_TYPE="- Select Service Type -" -COM_MOKOJOOMCROSS_FIELDSET_CREDENTIALS="API Credentials" -COM_MOKOJOOMCROSS_FIELD_CREDENTIALS="Credentials (JSON)" -COM_MOKOJOOMCROSS_FIELD_CREDENTIALS_DESC="JSON object with API keys and tokens for this service. Keys vary by platform." - -; Posts -COM_MOKOJOOMCROSS_FILTER_SEARCH="Search" -COM_MOKOJOOMCROSS_FILTER_STATUS="Status" -COM_MOKOJOOMCROSS_SELECT_STATUS="- Select Status -" -COM_MOKOJOOMCROSS_FILTER_SERVICE_TYPE="Service Type" -COM_MOKOJOOMCROSS_CREATED_ASC="Created ascending" -COM_MOKOJOOMCROSS_CREATED_DESC="Created descending" -COM_MOKOJOOMCROSS_STATUS_ASC="Status ascending" -COM_MOKOJOOMCROSS_STATUS_DESC="Status descending" - -; Actions -COM_MOKOJOOMCROSS_ACTION_CROSSPOST="Cross-post" -COM_MOKOJOOMCROSS_ACTION_MIGRATE="Migrate" - -; Configuration -COM_MOKOJOOMCROSS_CONFIG_COMPONENT="MokoJoomCross Settings" -COM_MOKOJOOMCROSS_CONFIG_AUTO_POST="Auto-post on Publish" -COM_MOKOJOOMCROSS_CONFIG_AUTO_POST_DESC="Automatically cross-post articles when they are published" -COM_MOKOJOOMCROSS_CONFIG_RETRY_MAX="Max Retries" -COM_MOKOJOOMCROSS_CONFIG_RETRY_MAX_DESC="Maximum number of retry attempts for failed posts" -COM_MOKOJOOMCROSS_CONFIG_RETRY_DELAY="Retry Delay (seconds)" -COM_MOKOJOOMCROSS_CONFIG_RETRY_DELAY_DESC="Seconds to wait before retrying a failed post" -COM_MOKOJOOMCROSS_CONFIG_LOG_RETENTION="Log Retention (days)" -COM_MOKOJOOMCROSS_CONFIG_LOG_RETENTION_DESC="Number of days to keep activity logs" -COM_MOKOJOOMCROSS_CONFIG_DEFAULT_TEMPLATE="Default Message Template" -COM_MOKOJOOMCROSS_CONFIG_DEFAULT_TEMPLATE_DESC="Default template for cross-posts. Placeholders: {title}, {url}, {introtext}, {image}, {category}, {author}" diff --git a/src/packages/com_mokojoomcross/src/Helper/MigrationHelper.php b/src/packages/com_mokojoomcross/src/Helper/MigrationHelper.php deleted file mode 100644 index dd3fed7..0000000 --- a/src/packages/com_mokojoomcross/src/Helper/MigrationHelper.php +++ /dev/null @@ -1,149 +0,0 @@ - - * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. - * @license GNU General Public License version 3 or later; see LICENSE - * SPDX-License-Identifier: GPL-3.0-or-later - */ - -namespace Joomla\Component\MokoJoomCross\Administrator\Helper; - -defined('_JEXEC') or die; - -use Joomla\CMS\Factory; - -/** - * Migration helper for importing settings from Perfect Publisher Pro. - * - * Reads Perfect Publisher Pro's component params and plugin configurations - * and maps them to MokoJoomCross service records. - */ -class MigrationHelper -{ - /** - * Service type mapping from Perfect Publisher Pro to MokoJoomCross. - * - * @var array - */ - private const SERVICE_MAP = [ - 'facebook' => 'facebook', - 'twitter' => 'twitter', - 'linkedin' => 'linkedin', - 'telegram' => 'telegram', - ]; - - /** - * Run the full migration from Perfect Publisher Pro. - * - * @return array ['migrated' => int, 'skipped' => int, 'errors' => string[]] - */ - public static function migrate(): array - { - $db = Factory::getDbo(); - $result = ['migrated' => 0, 'skipped' => 0, 'errors' => []]; - - // Read Perfect Publisher Pro component params - $query = $db->getQuery(true) - ->select($db->quoteName('params')) - ->from($db->quoteName('#__extensions')) - ->where($db->quoteName('element') . ' LIKE ' . $db->quote('%perfectpublisher%')) - ->where($db->quoteName('type') . ' = ' . $db->quote('component')); - - $db->setQuery($query); - $rawParams = $db->loadResult(); - - if (!$rawParams) { - $result['errors'][] = 'Perfect Publisher Pro not found or has no configuration.'; - - return $result; - } - - $params = json_decode($rawParams, true); - - if (!is_array($params)) { - $result['errors'][] = 'Could not parse Perfect Publisher Pro configuration.'; - - return $result; - } - - // Iterate known service mappings and create MokoJoomCross service records - foreach (self::SERVICE_MAP as $ppKey => $mjcType) { - $credentials = self::extractCredentials($params, $ppKey); - - if (empty($credentials)) { - $result['skipped']++; - continue; - } - - // Check if service already exists - $query = $db->getQuery(true) - ->select('COUNT(*)') - ->from($db->quoteName('#__mokojoomcross_services')) - ->where($db->quoteName('service_type') . ' = ' . $db->quote($mjcType)); - $db->setQuery($query); - - if ((int) $db->loadResult() > 0) { - $result['skipped']++; - continue; - } - - // Insert new service record - $service = (object) [ - 'title' => ucfirst($mjcType) . ' (migrated from PP Pro)', - 'alias' => $mjcType . '-migrated', - 'service_type' => $mjcType, - 'credentials' => json_encode($credentials), - 'params' => '{}', - 'published' => 0, // Disabled until user verifies - 'ordering' => 0, - 'created' => Factory::getDate()->toSql(), - 'modified' => Factory::getDate()->toSql(), - 'created_by' => Factory::getApplication()->getIdentity()->id ?? 0, - ]; - - $db->insertObject('#__mokojoomcross_services', $service); - $result['migrated']++; - } - - // Clear migration flag - $query = $db->getQuery(true) - ->update($db->quoteName('#__extensions')) - ->set($db->quoteName('params') . ' = ' . $db->quote('{}')) - ->where($db->quoteName('type') . ' = ' . $db->quote('component')) - ->where($db->quoteName('element') . ' = ' . $db->quote('com_mokojoomcross')); - $db->setQuery($query); - $db->execute(); - - return $result; - } - - /** - * Extract credentials for a specific service from PP Pro params. - * - * @param array $params PP Pro component params - * @param string $serviceKey Service key in PP Pro params - * - * @return array Credential key/value pairs (empty if none found) - */ - private static function extractCredentials(array $params, string $serviceKey): array - { - $credentials = []; - - // PP Pro uses various key patterns: {service}_app_id, {service}_api_key, etc. - $prefixes = [$serviceKey . '_', $serviceKey . 'api_', $serviceKey . '-']; - - foreach ($params as $key => $value) { - foreach ($prefixes as $prefix) { - if (str_starts_with($key, $prefix) && !empty($value)) { - $cleanKey = str_replace($prefix, '', $key); - $credentials[$cleanKey] = $value; - } - } - } - - return $credentials; - } -} diff --git a/src/packages/com_mokojoomcross/src/Model/DashboardModel.php b/src/packages/com_mokojoomcross/src/Model/DashboardModel.php deleted file mode 100644 index dcbf93c..0000000 --- a/src/packages/com_mokojoomcross/src/Model/DashboardModel.php +++ /dev/null @@ -1,73 +0,0 @@ - - * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. - * @license GNU General Public License version 3 or later; see LICENSE - * SPDX-License-Identifier: GPL-3.0-or-later - */ - -namespace Joomla\Component\MokoJoomCross\Administrator\Model; - -defined('_JEXEC') or die; - -use Joomla\CMS\Factory; -use Joomla\CMS\MVC\Model\BaseDatabaseModel; - -class DashboardModel extends BaseDatabaseModel -{ - /** - * Get summary statistics for the dashboard. - * - * @return object Stats object with counts - */ - public function getStats(): object - { - $db = $this->getDatabase(); - - $stats = new \stdClass(); - - // Active services count - $query = $db->getQuery(true) - ->select('COUNT(*)') - ->from($db->quoteName('#__mokojoomcross_services')) - ->where($db->quoteName('published') . ' = 1'); - $db->setQuery($query); - $stats->active_services = (int) $db->loadResult(); - - // Posts by status - foreach (['queued', 'posted', 'failed'] as $status) { - $query = $db->getQuery(true) - ->select('COUNT(*)') - ->from($db->quoteName('#__mokojoomcross_posts')) - ->where($db->quoteName('status') . ' = ' . $db->quote($status)); - $db->setQuery($query); - $stats->{$status . '_count'} = (int) $db->loadResult(); - } - - return $stats; - } - - /** - * Check if Perfect Publisher Pro migration is available. - * - * @return bool - */ - public function isMigrationAvailable(): bool - { - $db = $this->getDatabase(); - - $query = $db->getQuery(true) - ->select($db->quoteName('params')) - ->from($db->quoteName('#__extensions')) - ->where($db->quoteName('type') . ' = ' . $db->quote('component')) - ->where($db->quoteName('element') . ' = ' . $db->quote('com_mokojoomcross')); - - $db->setQuery($query); - $params = json_decode($db->loadResult() ?: '{}', true); - - return !empty($params['migration_available']); - } -} diff --git a/src/packages/com_mokojoomcross/src/View/Dashboard/HtmlView.php b/src/packages/com_mokojoomcross/src/View/Dashboard/HtmlView.php deleted file mode 100644 index b4ba7e5..0000000 --- a/src/packages/com_mokojoomcross/src/View/Dashboard/HtmlView.php +++ /dev/null @@ -1,39 +0,0 @@ - - * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. - * @license GNU General Public License version 3 or later; see LICENSE - * SPDX-License-Identifier: GPL-3.0-or-later - */ - -namespace Joomla\Component\MokoJoomCross\Administrator\View\Dashboard; - -defined('_JEXEC') or die; - -use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView; -use Joomla\CMS\Toolbar\ToolbarHelper; - -class HtmlView extends BaseHtmlView -{ - protected $stats; - protected $migrationAvailable; - - public function display($tpl = null): void - { - $this->stats = $this->get('Stats'); - $this->migrationAvailable = $this->get('MigrationAvailable'); - - $this->addToolbar(); - - parent::display($tpl); - } - - protected function addToolbar(): void - { - ToolbarHelper::title('MokoJoomCross — Dashboard', 'share-alt'); - ToolbarHelper::preferences('com_mokojoomcross'); - } -} diff --git a/src/packages/com_mokojoomcross/src/View/Posts/HtmlView.php b/src/packages/com_mokojoomcross/src/View/Posts/HtmlView.php deleted file mode 100644 index 79e47b3..0000000 --- a/src/packages/com_mokojoomcross/src/View/Posts/HtmlView.php +++ /dev/null @@ -1,41 +0,0 @@ - - * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. - * @license GNU General Public License version 3 or later; see LICENSE - * SPDX-License-Identifier: GPL-3.0-or-later - */ - -namespace Joomla\Component\MokoJoomCross\Administrator\View\Posts; - -defined('_JEXEC') or die; - -use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView; -use Joomla\CMS\Toolbar\ToolbarHelper; - -class HtmlView extends BaseHtmlView -{ - protected $items; - protected $pagination; - protected $state; - - public function display($tpl = null): void - { - $this->items = $this->get('Items'); - $this->pagination = $this->get('Pagination'); - $this->state = $this->get('State'); - - $this->addToolbar(); - - parent::display($tpl); - } - - protected function addToolbar(): void - { - ToolbarHelper::title('MokoJoomCross — Post Queue', 'share-alt'); - ToolbarHelper::deleteList('', 'posts.delete', 'JTOOLBAR_DELETE'); - } -} diff --git a/src/packages/com_mokojoomcross/tmpl/dashboard/default.php b/src/packages/com_mokojoomcross/tmpl/dashboard/default.php deleted file mode 100644 index 658cc2d..0000000 --- a/src/packages/com_mokojoomcross/tmpl/dashboard/default.php +++ /dev/null @@ -1,90 +0,0 @@ - - * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. - * @license GNU General Public License version 3 or later; see LICENSE - * SPDX-License-Identifier: GPL-3.0-or-later - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\Language\Text; -use Joomla\CMS\Router\Route; - -/** @var \Joomla\Component\MokoJoomCross\Administrator\View\Dashboard\HtmlView $this */ -$stats = $this->stats; -?> - - - - - - - - active_services; ?> - - - - - - - - queued_count; ?> - - - - - - - - posted_count; ?> - - - - - - - - failed_count; ?> - - - - - - migrationAvailable) : ?> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/packages/plg_content_mokojoomcross/language/en-GB/index.html b/src/packages/plg_content_mokojoomcross/language/en-GB/index.html deleted file mode 100644 index 6182993..0000000 --- a/src/packages/plg_content_mokojoomcross/language/en-GB/index.html +++ /dev/null @@ -1 +0,0 @@ -<\!DOCTYPE html> diff --git a/src/packages/plg_content_mokojoomcross/language/en-GB/plg_content_mokojoomcross.sys.ini b/src/packages/plg_content_mokojoomcross/language/en-GB/plg_content_mokojoomcross.sys.ini deleted file mode 100644 index b3bd1ee..0000000 --- a/src/packages/plg_content_mokojoomcross/language/en-GB/plg_content_mokojoomcross.sys.ini +++ /dev/null @@ -1,2 +0,0 @@ -PLG_CONTENT_MOKOJOOMCROSS="Content - MokoJoomCross" -PLG_CONTENT_MOKOJOOMCROSS_DESCRIPTION="Adds cross-post status badges to articles in the admin backend." diff --git a/src/packages/plg_content_mokojoomcross/src/Extension/MokoJoomCrossContent.php b/src/packages/plg_content_mokojoomcross/src/Extension/MokoJoomCrossContent.php deleted file mode 100644 index cd76c8b..0000000 --- a/src/packages/plg_content_mokojoomcross/src/Extension/MokoJoomCrossContent.php +++ /dev/null @@ -1,85 +0,0 @@ - - * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. - * @license GNU General Public License version 3 or later; see LICENSE - * SPDX-License-Identifier: GPL-3.0-or-later - */ - -namespace Joomla\Plugin\Content\MokoJoomCross\Extension; - -defined('_JEXEC') or die; - -use Joomla\CMS\Factory; -use Joomla\CMS\Plugin\CMSPlugin; -use Joomla\Event\SubscriberInterface; - -/** - * Content plugin that adds cross-post status badges to article views. - */ -class MokoJoomCrossContent extends CMSPlugin implements SubscriberInterface -{ - public static function getSubscribedEvents(): array - { - return [ - 'onContentBeforeDisplay' => 'onContentBeforeDisplay', - ]; - } - - /** - * Add cross-post status indicator before article content in admin. - * - * @param string $context The context - * @param object $article The article - * @param object $params The article params - * @param int $page The page number - * - * @return string HTML to prepend to the article - */ - public function onContentBeforeDisplay(string $context, &$article, &$params, int $page = 0): string - { - if ($context !== 'com_content.article') { - return ''; - } - - $app = $this->getApplication(); - - if (!$app->isClient('administrator')) { - return ''; - } - - $db = Factory::getDbo(); - - $query = $db->getQuery(true) - ->select('p.status, s.service_type') - ->from($db->quoteName('#__mokojoomcross_posts', 'p')) - ->join('LEFT', $db->quoteName('#__mokojoomcross_services', 's') - . ' ON ' . $db->quoteName('s.id') . ' = ' . $db->quoteName('p.service_id')) - ->where($db->quoteName('p.article_id') . ' = ' . (int) $article->id) - ->order($db->quoteName('p.created') . ' DESC'); - - $db->setQuery($query, 0, 10); - $posts = $db->loadObjectList(); - - if (empty($posts)) { - return ''; - } - - $badges = ''; - - foreach ($posts as $post) { - $class = match ($post->status) { - 'posted' => 'badge bg-success', - 'failed' => 'badge bg-danger', - 'queued' => 'badge bg-warning', - default => 'badge bg-secondary', - }; - $badges .= '' . htmlspecialchars($post->service_type) . ''; - } - - return '' . $badges . ''; - } -} diff --git a/src/packages/plg_mokojoomcross_bluesky/language/en-GB/plg_mokojoomcross_bluesky.sys.ini b/src/packages/plg_mokojoomcross_bluesky/language/en-GB/plg_mokojoomcross_bluesky.sys.ini deleted file mode 100644 index fc9b753..0000000 --- a/src/packages/plg_mokojoomcross_bluesky/language/en-GB/plg_mokojoomcross_bluesky.sys.ini +++ /dev/null @@ -1,2 +0,0 @@ -PLG_MOKOJOOMCROSS_BLUESKY="MokoJoomCross - Bluesky" -PLG_MOKOJOOMCROSS_BLUESKY_DESCRIPTION="Cross-post Joomla articles to Bluesky." diff --git a/src/packages/plg_mokojoomcross_discord/language/en-GB/plg_mokojoomcross_discord.sys.ini b/src/packages/plg_mokojoomcross_discord/language/en-GB/plg_mokojoomcross_discord.sys.ini deleted file mode 100644 index 10a174f..0000000 --- a/src/packages/plg_mokojoomcross_discord/language/en-GB/plg_mokojoomcross_discord.sys.ini +++ /dev/null @@ -1,2 +0,0 @@ -PLG_MOKOJOOMCROSS_DISCORD="MokoJoomCross - Discord" -PLG_MOKOJOOMCROSS_DISCORD_DESCRIPTION="Cross-post Joomla articles to Discord." diff --git a/src/packages/plg_mokojoomcross_facebook/language/en-GB/plg_mokojoomcross_facebook.sys.ini b/src/packages/plg_mokojoomcross_facebook/language/en-GB/plg_mokojoomcross_facebook.sys.ini deleted file mode 100644 index 168e629..0000000 --- a/src/packages/plg_mokojoomcross_facebook/language/en-GB/plg_mokojoomcross_facebook.sys.ini +++ /dev/null @@ -1,2 +0,0 @@ -PLG_MOKOJOOMCROSS_FACEBOOK="MokoJoomCross - Facebook / Meta" -PLG_MOKOJOOMCROSS_FACEBOOK_DESCRIPTION="Cross-post Joomla articles to Facebook / Meta." diff --git a/src/packages/plg_mokojoomcross_linkedin/language/en-GB/plg_mokojoomcross_linkedin.sys.ini b/src/packages/plg_mokojoomcross_linkedin/language/en-GB/plg_mokojoomcross_linkedin.sys.ini deleted file mode 100644 index f7793bb..0000000 --- a/src/packages/plg_mokojoomcross_linkedin/language/en-GB/plg_mokojoomcross_linkedin.sys.ini +++ /dev/null @@ -1,2 +0,0 @@ -PLG_MOKOJOOMCROSS_LINKEDIN="MokoJoomCross - LinkedIn" -PLG_MOKOJOOMCROSS_LINKEDIN_DESCRIPTION="Cross-post Joomla articles to LinkedIn." diff --git a/src/packages/plg_mokojoomcross_mailchimp/language/en-GB/plg_mokojoomcross_mailchimp.sys.ini b/src/packages/plg_mokojoomcross_mailchimp/language/en-GB/plg_mokojoomcross_mailchimp.sys.ini deleted file mode 100644 index 6b08b10..0000000 --- a/src/packages/plg_mokojoomcross_mailchimp/language/en-GB/plg_mokojoomcross_mailchimp.sys.ini +++ /dev/null @@ -1,2 +0,0 @@ -PLG_MOKOJOOMCROSS_MAILCHIMP="MokoJoomCross - Mailchimp" -PLG_MOKOJOOMCROSS_MAILCHIMP_DESCRIPTION="Cross-post Joomla articles to Mailchimp." diff --git a/src/packages/plg_mokojoomcross_mastodon/language/en-GB/plg_mokojoomcross_mastodon.sys.ini b/src/packages/plg_mokojoomcross_mastodon/language/en-GB/plg_mokojoomcross_mastodon.sys.ini deleted file mode 100644 index b663b97..0000000 --- a/src/packages/plg_mokojoomcross_mastodon/language/en-GB/plg_mokojoomcross_mastodon.sys.ini +++ /dev/null @@ -1,2 +0,0 @@ -PLG_MOKOJOOMCROSS_MASTODON="MokoJoomCross - Mastodon" -PLG_MOKOJOOMCROSS_MASTODON_DESCRIPTION="Cross-post Joomla articles to Mastodon." diff --git a/src/packages/plg_mokojoomcross_slack/language/en-GB/plg_mokojoomcross_slack.sys.ini b/src/packages/plg_mokojoomcross_slack/language/en-GB/plg_mokojoomcross_slack.sys.ini deleted file mode 100644 index e6dbc44..0000000 --- a/src/packages/plg_mokojoomcross_slack/language/en-GB/plg_mokojoomcross_slack.sys.ini +++ /dev/null @@ -1,2 +0,0 @@ -PLG_MOKOJOOMCROSS_SLACK="MokoJoomCross - Slack" -PLG_MOKOJOOMCROSS_SLACK_DESCRIPTION="Cross-post Joomla articles to Slack." diff --git a/src/packages/plg_mokojoomcross_telegram/language/en-GB/plg_mokojoomcross_telegram.sys.ini b/src/packages/plg_mokojoomcross_telegram/language/en-GB/plg_mokojoomcross_telegram.sys.ini deleted file mode 100644 index 2b2467f..0000000 --- a/src/packages/plg_mokojoomcross_telegram/language/en-GB/plg_mokojoomcross_telegram.sys.ini +++ /dev/null @@ -1,2 +0,0 @@ -PLG_MOKOJOOMCROSS_TELEGRAM="MokoJoomCross - Telegram" -PLG_MOKOJOOMCROSS_TELEGRAM_DESCRIPTION="Cross-post Joomla articles to Telegram." diff --git a/src/packages/plg_mokojoomcross_twitter/src/Extension/TwitterService.php b/src/packages/plg_mokojoomcross_twitter/src/Extension/TwitterService.php deleted file mode 100644 index 8911af2..0000000 --- a/src/packages/plg_mokojoomcross_twitter/src/Extension/TwitterService.php +++ /dev/null @@ -1,122 +0,0 @@ - - * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. - * @license GNU General Public License version 3 or later; see LICENSE - * SPDX-License-Identifier: GPL-3.0-or-later - */ - -namespace Joomla\Plugin\MokoJoomCross\Twitter\Extension; - -defined('_JEXEC') or die; - -use Joomla\CMS\Plugin\CMSPlugin; -use Joomla\Component\MokoJoomCross\Administrator\Service\MokoJoomCrossServiceInterface; -use Joomla\Event\SubscriberInterface; - -/** - * X/Twitter service plugin for MokoJoomCross. - * - * Uses Twitter API v2 with OAuth 2.0 Bearer Token. - * - * Credentials format: - * { - * "bearer_token": "...", - * "api_key": "...", - * "api_secret": "...", - * "access_token": "...", - * "access_token_secret": "..." - * } - */ -class TwitterService extends CMSPlugin implements SubscriberInterface, MokoJoomCrossServiceInterface -{ - public static function getSubscribedEvents(): array - { - return [ - 'onMokoJoomCrossGetServices' => 'onMokoJoomCrossGetServices', - ]; - } - - public function onMokoJoomCrossGetServices(&$services): void - { - $services[] = $this; - } - - public function getServiceType(): string - { - return 'twitter'; - } - - public function getServiceName(): string - { - return 'X / Twitter'; - } - - public function publish(string $message, array $media, array $credentials, array $params): array - { - // Twitter API v2 tweet creation - $apiUrl = 'https://api.twitter.com/2/tweets'; - - $postData = json_encode(['text' => mb_substr($message, 0, 280)]); - - $ch = curl_init($apiUrl); - curl_setopt_array($ch, [ - CURLOPT_POST => true, - CURLOPT_POSTFIELDS => $postData, - CURLOPT_HTTPHEADER => [ - 'Content-Type: application/json', - 'Authorization: Bearer ' . ($credentials['bearer_token'] ?? ''), - ], - CURLOPT_RETURNTRANSFER => true, - CURLOPT_TIMEOUT => 30, - ]); - - $response = curl_exec($ch); - $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); - curl_close($ch); - - $data = json_decode($response, true) ?: []; - - if ($httpCode === 201 && !empty($data['data']['id'])) { - return ['success' => true, 'platform_post_id' => $data['data']['id'], 'response' => $data]; - } - - return ['success' => false, 'platform_post_id' => '', 'response' => $data]; - } - - public function validateCredentials(array $credentials): array - { - $apiUrl = 'https://api.twitter.com/2/users/me'; - - $ch = curl_init($apiUrl); - curl_setopt_array($ch, [ - CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . ($credentials['bearer_token'] ?? '')], - CURLOPT_RETURNTRANSFER => true, - CURLOPT_TIMEOUT => 10, - ]); - - $response = curl_exec($ch); - curl_close($ch); - - $data = json_decode($response, true) ?: []; - - if (!empty($data['data']['username'])) { - return ['valid' => true, 'message' => 'Connected', 'account_name' => '@' . $data['data']['username']]; - } - - return ['valid' => false, 'message' => $data['detail'] ?? 'Failed', 'account_name' => '']; - } - - public function getMaxLength(): int - { - return 280; - } - - public function supportsMedia(): bool - { - return true; - } -} diff --git a/src/packages/plg_system_mokojoomcross/src/Extension/MokoJoomCross.php b/src/packages/plg_system_mokojoomcross/src/Extension/MokoJoomCross.php deleted file mode 100644 index 665df1b..0000000 --- a/src/packages/plg_system_mokojoomcross/src/Extension/MokoJoomCross.php +++ /dev/null @@ -1,166 +0,0 @@ - - * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. - * @license GNU General Public License version 3 or later; see LICENSE - * SPDX-License-Identifier: GPL-3.0-or-later - */ - -namespace Joomla\Plugin\System\MokoJoomCross\Extension; - -defined('_JEXEC') or die; - -use Joomla\CMS\Component\ComponentHelper; -use Joomla\CMS\Factory; -use Joomla\CMS\Plugin\CMSPlugin; -use Joomla\CMS\Plugin\PluginHelper; -use Joomla\Component\MokoJoomCross\Administrator\Service\MokoJoomCrossServiceInterface; -use Joomla\Event\SubscriberInterface; - -/** - * System plugin that triggers cross-posting when Joomla articles are published. - * - * Listens for onContentAfterSave events on com_content articles. When an article - * transitions to published state, it dispatches the post to all enabled service - * plugins in the `mokojoomcross` plugin group. - */ -class MokoJoomCross extends CMSPlugin implements SubscriberInterface -{ - public static function getSubscribedEvents(): array - { - return [ - 'onContentAfterSave' => 'onContentAfterSave', - ]; - } - - /** - * Triggered after a content item is saved. - * - * @param string $context The context (e.g. 'com_content.article') - * @param object $article The article object - * @param bool $isNew Whether this is a new article - * - * @return void - */ - public function onContentAfterSave(string $context, $article, bool $isNew): void - { - // Only process Joomla articles - if ($context !== 'com_content.article') { - return; - } - - // Only cross-post when article is published - if ((int) ($article->state ?? 0) !== 1) { - return; - } - - // Check global auto-post setting - $componentParams = ComponentHelper::getParams('com_mokojoomcross'); - - if (!$componentParams->get('auto_post_on_publish', 1)) { - return; - } - - $this->dispatchCrossPost($article); - } - - /** - * Dispatch article to all enabled service plugins. - * - * @param object $article The article object - * - * @return void - */ - private function dispatchCrossPost(object $article): void - { - $db = Factory::getDbo(); - - // Load all enabled services - $query = $db->getQuery(true) - ->select('*') - ->from($db->quoteName('#__mokojoomcross_services')) - ->where($db->quoteName('published') . ' = 1') - ->order($db->quoteName('ordering') . ' ASC'); - - $db->setQuery($query); - $services = $db->loadObjectList(); - - if (empty($services)) { - return; - } - - // Import service plugins - PluginHelper::importPlugin('mokojoomcross'); - - foreach ($services as $service) { - // Queue the post - $post = (object) [ - 'article_id' => $article->id, - 'service_id' => $service->id, - 'status' => 'queued', - 'message' => $this->renderTemplate($article, $service), - 'created' => Factory::getDate()->toSql(), - 'modified' => Factory::getDate()->toSql(), - ]; - - $db->insertObject('#__mokojoomcross_posts', $post); - - // Log the queue action - $log = (object) [ - 'post_id' => $db->insertid(), - 'service_id' => $service->id, - 'level' => 'info', - 'message' => sprintf('Article "%s" queued for %s', $article->title, $service->service_type), - 'context' => json_encode(['article_id' => $article->id]), - 'created' => Factory::getDate()->toSql(), - ]; - - $db->insertObject('#__mokojoomcross_logs', $log); - } - } - - /** - * Render the message template for a service. - * - * @param object $article The article - * @param object $service The service record - * - * @return string Rendered message - */ - private function renderTemplate(object $article, object $service): string - { - $db = Factory::getDbo(); - - // Try service-specific template first, fall back to default - $query = $db->getQuery(true) - ->select($db->quoteName('template_body')) - ->from($db->quoteName('#__mokojoomcross_templates')) - ->where($db->quoteName('published') . ' = 1') - ->where('(' . $db->quoteName('service_type') . ' = ' . $db->quote($service->service_type) - . ' OR ' . $db->quoteName('service_type') . ' = ' . $db->quote('default') . ')') - ->order('CASE WHEN ' . $db->quoteName('service_type') . ' = ' - . $db->quote($service->service_type) . ' THEN 0 ELSE 1 END') - ->setLimit(1); - - $db->setQuery($query); - $template = $db->loadResult() ?: '{title}\n\n{url}'; - - // Build article URL - $url = \Joomla\CMS\Uri\Uri::root() . 'index.php?option=com_content&view=article&id=' . $article->id; - - // Replace placeholders - $replacements = [ - '{title}' => $article->title ?? '', - '{introtext}' => strip_tags(mb_substr($article->introtext ?? '', 0, 280)), - '{url}' => $url, - '{image}' => json_decode($article->images ?? '{}')->image_intro ?? '', - '{category}' => '', - '{author}' => '', - ]; - - return str_replace(array_keys($replacements), array_values($replacements), $template); - } -} diff --git a/src/packages/plg_webservices_mokojoomcross/src/Extension/MokoJoomCrossWebServices.php b/src/packages/plg_webservices_mokojoomcross/src/Extension/MokoJoomCrossWebServices.php deleted file mode 100644 index 222ced9..0000000 --- a/src/packages/plg_webservices_mokojoomcross/src/Extension/MokoJoomCrossWebServices.php +++ /dev/null @@ -1,52 +0,0 @@ - - * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. - * @license GNU General Public License version 3 or later; see LICENSE - * SPDX-License-Identifier: GPL-3.0-or-later - */ - -namespace Joomla\Plugin\WebServices\MokoJoomCross\Extension; - -defined('_JEXEC') or die; - -use Joomla\CMS\Plugin\CMSPlugin; -use Joomla\CMS\Router\ApiRouter; -use Joomla\Event\SubscriberInterface; - -/** - * WebServices plugin providing REST API endpoints for MokoJoomCross. - * - * Endpoints: - * GET /api/index.php/v1/mokojoomcross/posts — List cross-posts - * GET /api/index.php/v1/mokojoomcross/posts/:id — Get single post - * GET /api/index.php/v1/mokojoomcross/services — List services - * POST /api/index.php/v1/mokojoomcross/crosspost — Trigger cross-post for an article - */ -class MokoJoomCrossWebServices extends CMSPlugin implements SubscriberInterface -{ - public static function getSubscribedEvents(): array - { - return [ - 'onBeforeApiRoute' => 'onBeforeApiRoute', - ]; - } - - public function onBeforeApiRoute(&$router): void - { - $router->createCRUDRoutes( - 'v1/mokojoomcross/posts', - 'posts', - ['component' => 'com_mokojoomcross'] - ); - - $router->createCRUDRoutes( - 'v1/mokojoomcross/services', - 'services', - ['component' => 'com_mokojoomcross'] - ); - } -} diff --git a/src/pkg_mokojoomcross.xml b/src/pkg_mokojoomcross.xml deleted file mode 100644 index 0bdfc0d..0000000 --- a/src/pkg_mokojoomcross.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - MokoJoomCross - mokojoomcross - 01.01.00 - 2026-05-28 - Moko Consulting - hello@mokoconsulting.tech - https://mokoconsulting.tech - Copyright (C) 2026 Moko Consulting. All rights reserved. - GPL-3.0-or-later - PKG_MOKOJOOMCROSS_DESCRIPTION - - script.php - - - - com_mokojoomcross.zip - plg_system_mokojoomcross.zip - plg_content_mokojoomcross.zip - plg_webservices_mokojoomcross.zip - - - plg_mokojoomcross_facebook.zip - plg_mokojoomcross_twitter.zip - plg_mokojoomcross_linkedin.zip - plg_mokojoomcross_mastodon.zip - plg_mokojoomcross_bluesky.zip - plg_mokojoomcross_mailchimp.zip - plg_mokojoomcross_telegram.zip - plg_mokojoomcross_discord.zip - plg_mokojoomcross_slack.zip - - - - language/en-GB/pkg_mokojoomcross.sys.ini - - - - https://git.mokoconsulting.tech/MokoConsulting/MokoJoomCross/updates.xml - - - true - diff --git a/src/script.php b/src/script.php deleted file mode 100644 index 6e3d090..0000000 --- a/src/script.php +++ /dev/null @@ -1,133 +0,0 @@ - - * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved. - * @license GNU General Public License version 3 or later; see LICENSE - * SPDX-License-Identifier: GPL-3.0-or-later - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\Factory; -use Joomla\CMS\Installer\InstallerAdapter; -use Joomla\CMS\Language\Text; - -class Pkg_MokoJoomCrossInstallerScript -{ - /** - * Minimum PHP version required - * - * @var string - */ - protected $minimumPhp = '8.1.0'; - - /** - * Called before any install/update/uninstall action. - * - * @param string $type Action type (install, update, uninstall) - * @param InstallerAdapter $parent Installer adapter - * - * @return bool - */ - public function preflight(string $type, InstallerAdapter $parent): bool - { - if (version_compare(PHP_VERSION, $this->minimumPhp, '<')) { - Factory::getApplication()->enqueueMessage( - Text::sprintf('PKG_MOKOJOOMCROSS_PHP_VERSION_ERROR', $this->minimumPhp), - 'error' - ); - - return false; - } - - return true; - } - - /** - * Called after install/update. - * - * @param string $type Action type - * @param InstallerAdapter $parent Installer adapter - * - * @return void - */ - public function postflight(string $type, InstallerAdapter $parent): void - { - $db = Factory::getDbo(); - - if ($type === 'install') { - // Enable core plugins automatically on fresh install - $corePlugins = [ - ['system', 'mokojoomcross'], - ['content', 'mokojoomcross'], - ['webservices', 'mokojoomcross'], - ]; - - foreach ($corePlugins as [$folder, $element]) { - $query = $db->getQuery(true) - ->update($db->quoteName('#__extensions')) - ->set($db->quoteName('enabled') . ' = 1') - ->where($db->quoteName('type') . ' = ' . $db->quote('plugin')) - ->where($db->quoteName('folder') . ' = ' . $db->quote($folder)) - ->where($db->quoteName('element') . ' = ' . $db->quote($element)); - - $db->setQuery($query); - $db->execute(); - } - - // Enable all service plugins in the mokojoomcross group - $query = $db->getQuery(true) - ->update($db->quoteName('#__extensions')) - ->set($db->quoteName('enabled') . ' = 1') - ->where($db->quoteName('type') . ' = ' . $db->quote('plugin')) - ->where($db->quoteName('folder') . ' = ' . $db->quote('mokojoomcross')); - - $db->setQuery($query); - $db->execute(); - - // Check for Perfect Publisher Pro and offer migration - $this->detectPerfectPublisherPro($db); - } - } - - /** - * Detect Perfect Publisher Pro installation and store migration flag. - * - * @param \Joomla\Database\DatabaseInterface $db Database driver - * - * @return void - */ - private function detectPerfectPublisherPro($db): void - { - $query = $db->getQuery(true) - ->select($db->quoteName(['element', 'params'])) - ->from($db->quoteName('#__extensions')) - ->where($db->quoteName('element') . ' LIKE ' . $db->quote('%perfectpublisher%')) - ->where($db->quoteName('type') . ' = ' . $db->quote('component')); - - $db->setQuery($query); - $result = $db->loadObject(); - - if ($result) { - Factory::getApplication()->enqueueMessage( - Text::_('PKG_MOKOJOOMCROSS_MIGRATION_DETECTED'), - 'notice' - ); - - // Store migration availability in component params - $query = $db->getQuery(true) - ->update($db->quoteName('#__extensions')) - ->set($db->quoteName('params') . ' = ' . $db->quote(json_encode([ - 'migration_available' => 'perfectpublisher', - 'migration_source_params' => $result->params, - ]))) - ->where($db->quoteName('type') . ' = ' . $db->quote('component')) - ->where($db->quoteName('element') . ' = ' . $db->quote('com_mokojoomcross')); - - $db->setQuery($query); - $db->execute(); - } - } -}
active_services; ?>
queued_count; ?>
posted_count; ?>
failed_count; ?>