Files
MokoSuiteCross/wiki/developer/Adding-Custom-Services.md
T
Jonathan Miller 148e133fc3
Generic: Repo Health / Site Health (push) Has been skipped
Generic: Repo Health / Access control (push) Successful in 1s
Universal: Auto Version Bump / Version Bump (push) Successful in 3s
Generic: Project CI / Lint & Validate (push) Successful in 12s
Generic: Project CI / Tests (push) Has been cancelled
Generic: Repo Health / Scripts governance (push) Has been cancelled
Generic: Repo Health / Repository health (push) Has been cancelled
Generic: Repo Health / Report Issues (push) Has been cancelled
feat: Telegram @mokosuite_bot default, wiki folders, README/CHANGELOG update
- Telegram: updated default bot from @MokoWaaSBot to @mokosuite_bot
- Telegram: embedded obfuscated bot token in plugin PHP (XOR + base64)
- Telegram: added <config> section to plugin XML for parse_mode/preview
- Telegram: removed bot token from admin-visible plugin params
- Branding: replaced all MokoWaaS references with MokoSuite
- Wiki: reorganized into getting-started/, user-guide/, services/, developer/
- README: updated with all 36 service plugins and current features
- CHANGELOG: added entries for recent fixes and changes
2026-06-21 15:27:12 -05:00

2.5 KiB

Adding Custom Services

MokoSuiteCross uses a plugin-based architecture. Any developer can create a new service plugin.

Plugin Structure

Create a Joomla plugin in the mokosuitecross group:

plg_mokosuitecross_myservice/
├── myservice.xml           # Plugin manifest (group="mokosuitecross")
├── myservice.php           # Legacy stub (empty)
├── src/
│   └── Extension/
│       └── MyserviceService.php   # Implements MokoSuiteCrossServiceInterface
├── services/
│   └── provider.php        # DI container registration
└── language/
    └── en-GB/
        ├── plg_mokosuitecross_myservice.ini
        └── plg_mokosuitecross_myservice.sys.ini

Implement the Interface

Your Extension class must implement MokoSuiteCrossServiceInterface:

namespace Joomla\Plugin\MokoSuiteCross\Myservice\Extension;

use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\Component\MokoSuiteCross\Administrator\Service\MokoSuiteCrossServiceInterface;
use Joomla\Event\SubscriberInterface;

class MyserviceService extends CMSPlugin implements SubscriberInterface, MokoSuiteCrossServiceInterface
{
    public static function getSubscribedEvents(): array
    {
        return ['onMokoSuiteCrossGetServices' => 'onMokoSuiteCrossGetServices'];
    }

    public function onMokoSuiteCrossGetServices(&$services): void
    {
        $services[] = $this;
    }

    public function getServiceType(): string { return 'myservice'; }
    public function getServiceName(): string { return 'My Service'; }
    public function getMaxLength(): int { return 500; }
    public function supportsMedia(): bool { return true; }

    public function publish(string $message, array $media, array $credentials, array $params): array
    {
        // Your API integration here
        return ['success' => true, 'platform_post_id' => '...', 'response' => [...]];
    }

    public function validateCredentials(array $credentials): array
    {
        return ['valid' => true, 'message' => 'OK', 'account_name' => '...'];
    }
}

Required Methods

Method Returns Purpose
getServiceType() string Unique identifier (lowercase, no spaces)
getServiceName() string Display name in admin UI
publish() array Send content to the platform
validateCredentials() array Test if credentials work
getMaxLength() int Character limit (0 = no limit)
supportsMedia() bool Whether images can be attached