From 132d3900593bfc1b64a96d5fc0a3fa36c503db58 Mon Sep 17 00:00:00 2001 From: Rick Sanchez <101627789+m4tinbeigi-official@users.noreply.github.com> Date: Fri, 26 Jun 2026 23:54:41 +0330 Subject: [PATCH] =?UTF-8?q?feat:=20Add=20Melipayamak=20(=D9=85=D9=84=DB=8C?= =?UTF-8?q?=20=D9=BE=DB=8C=D8=A7=D9=85=DA=A9)=20platform=20plugin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/platforms/melipayamak/__init__.py | 1 + plugins/platforms/melipayamak/adapter.py | 80 +++++++++++++++++++++++ plugins/platforms/melipayamak/plugin.yaml | 10 +++ 3 files changed, 91 insertions(+) create mode 100644 plugins/platforms/melipayamak/__init__.py create mode 100644 plugins/platforms/melipayamak/adapter.py create mode 100644 plugins/platforms/melipayamak/plugin.yaml diff --git a/plugins/platforms/melipayamak/__init__.py b/plugins/platforms/melipayamak/__init__.py new file mode 100644 index 000000000000..a315689076b0 --- /dev/null +++ b/plugins/platforms/melipayamak/__init__.py @@ -0,0 +1 @@ +from .adapter import register\n\n__all__ = ["register"]\n \ No newline at end of file diff --git a/plugins/platforms/melipayamak/adapter.py b/plugins/platforms/melipayamak/adapter.py new file mode 100644 index 000000000000..8cd9b4f2fe1d --- /dev/null +++ b/plugins/platforms/melipayamak/adapter.py @@ -0,0 +1,80 @@ +import asyncio +import logging +import os +from typing import Any, Dict, Optional +import aiohttp + +from gateway.config import PlatformConfig +from gateway.platforms.base import BasePlatformAdapter, SendResult +import hermes_cli.gateway as gateway_mod + +logger = logging.getLogger(__name__) + +def check_melipayamak_requirements() -> bool: + try: + import aiohttp + except ImportError: + return False + return bool(os.getenv("MELIPAYAMAK_USERNAME")) + +def _is_connected(config) -> bool: + return bool((gateway_mod.get_env_value("MELIPAYAMAK_USERNAME") or "").strip()) + +class MelipayamakAdapter(BasePlatformAdapter): + MAX_MESSAGE_LENGTH = 1000 + + def __init__(self, config: PlatformConfig): + super().__init__(config, "melipayamak") + self.env_vars = {k: os.getenv(k, "") for k in ['MELIPAYAMAK_USERNAME', 'MELIPAYAMAK_PASSWORD', 'MELIPAYAMAK_SENDER']} + self._http_session: Optional[aiohttp.ClientSession] = None + + async def connect(self, *, is_reconnect: bool = False) -> bool: + if not self.env_vars["MELIPAYAMAK_USERNAME"]: + return False + self._http_session = aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=30)) + self._running = True + return True + + async def disconnect(self) -> None: + if self._http_session: + await self._http_session.close() + self._http_session = None + self._running = False + + async def send(self, chat_id: str, content: str, reply_to: Optional[str] = None, metadata: Optional[Dict[str, Any]] = None) -> SendResult: + if not self._http_session: + return SendResult(success=False, error="Not connected") + try: + + payload = {"username": self.env_vars['MELIPAYAMAK_USERNAME'], "password": self.env_vars['MELIPAYAMAK_PASSWORD'], "to": chat_id, "text": content, "isflash": False} + if self.env_vars.get("MELIPAYAMAK_SENDER"): payload["from"] = self.env_vars["MELIPAYAMAK_SENDER"] + url = "https://rest.payamak-panel.com/api/SendSMS/SendSMS" + async with self._http_session.post(url, json=payload) as resp: + data = await resp.json() + if data.get("RetStatus") != 1: return SendResult(success=False, error=str(data)) + return SendResult(success=True, message_id=str(data.get("Value", ""))) + + except Exception as e: + return SendResult(success=False, error=str(e)) + + async def get_chat_info(self, chat_id: str) -> Dict[str, Any]: + return {"name": chat_id, "type": "dm"} + +def _build_adapter(config): + return MelipayamakAdapter(config) + +def register(ctx) -> None: + ctx.register_platform( + name="melipayamak", + label="Melipayamak (ملی پیامک)", + adapter_factory=_build_adapter, + check_fn=check_melipayamak_requirements, + is_connected=_is_connected, + required_env=["MELIPAYAMAK_USERNAME"], + install_hint="pip install aiohttp", + allowed_users_env="MELIPAYAMAK_ALLOWED_USERS", + allow_all_env="MELIPAYAMAK_ALLOW_ALL_USERS", + max_message_length=1000, + emoji="💬", + allow_update_command=True, + ) diff --git a/plugins/platforms/melipayamak/plugin.yaml b/plugins/platforms/melipayamak/plugin.yaml new file mode 100644 index 000000000000..0a5ec9f304ef --- /dev/null +++ b/plugins/platforms/melipayamak/plugin.yaml @@ -0,0 +1,10 @@ +name: melipayamak +label: Melipayamak (ملی پیامک) +kind: platform +version: 1.0.0 +description: Melipayamak (ملی پیامک) adapter. +author: Hermes Core Team +requires_env: + - name: MELIPAYAMAK_USERNAME\n description: "MELIPAYAMAK_USERNAME"\n prompt: "MELIPAYAMAK_USERNAME"\n password: true\n - name: MELIPAYAMAK_PASSWORD\n description: "MELIPAYAMAK_PASSWORD"\n prompt: "MELIPAYAMAK_PASSWORD"\n password: true\n +optional_env: + - name: MELIPAYAMAK_SENDER\n description: "MELIPAYAMAK_SENDER"\n prompt: "MELIPAYAMAK_SENDER"\n password: false\n