diff --git a/agent/characters/kongming/.gitignore b/agent/characters/kongming/.gitignore new file mode 100644 index 0000000..6b15748 --- /dev/null +++ b/agent/characters/kongming/.gitignore @@ -0,0 +1 @@ +service.yaml \ No newline at end of file diff --git a/agent/characters/kongming/service.default.yaml b/agent/characters/kongming/service.default.yaml new file mode 100644 index 0000000..86bb17b --- /dev/null +++ b/agent/characters/kongming/service.default.yaml @@ -0,0 +1,21 @@ +# This file serves as a template for character-specific service overrides. +# Copy this to agent/characters//service.yaml and fill in the credentials. + +xmpp: + enabled: false + username: "" + password: "" + muc_rooms: # YAML list, e.g.: + # - "room1@conference.server" + # - "room2@conference.server" + nickname: "" # custom MUC nickname (empty = use username) + selective_response: true # true = only response if mentioned/relevant + debug: false # true = tampilkan log debug menyeluruh (semua stanza XML, lifecycle, dll) + +telegram: + enabled: false + token: "" + allowed_group_ids: # YAML list, empty = all group. e.g.: + # - "123456789" + # - "987654321" + selective_response: true # true = only response if mentioned/relevant \ No newline at end of file diff --git a/config.py b/config.py index 0513f1d..94bd1fd 100644 --- a/config.py +++ b/config.py @@ -149,5 +149,94 @@ def load_character(char_override=None): AGENT_SKILLS = char_skills -# Load character dari config.yaml saat import time +SERVICE_YAML_PATH = None # Path service.yaml milik karakter aktif, jika ada + + +def _reset_service_from_config(): + """Reset konfigurasi service (xmpp/telegram) dari config.yaml global.""" + global XMPP_ENABLED, XMPP_USERNAME, XMPP_PASSWORD, XMPP_MUC_ROOMS + global XMPP_NICKNAME, XMPP_DEBUG, XMPP_SELECTIVE_RESPONSE + global TELEGRAM_ENABLED, TELEGRAM_TOKEN, TELEGRAM_ALLOWED_GROUP_IDS + global TELEGRAM_SELECTIVE_RESPONSE, SERVICE_YAML_PATH + + XMPP_USERNAME = _yaml_get("xmpp", "username", default="") + XMPP_PASSWORD = _yaml_get("xmpp", "password", default="") + XMPP_ENABLED = str(_yaml_get("xmpp", "enabled", default="false")).strip().lower() in ("true", "1", "yes") + XMPP_MUC_ROOMS = _as_list(_yaml_get("xmpp", "muc_rooms", default=[])) + XMPP_NICKNAME = _yaml_get("xmpp", "nickname", default="").strip() + XMPP_DEBUG = str(_yaml_get("xmpp", "debug", default="false")).strip().lower() in ("true", "1", "yes") + XMPP_SELECTIVE_RESPONSE = str(_yaml_get("xmpp", "selective_response", default="true")).strip().lower() in ("true", "1", "yes") + + TELEGRAM_ENABLED = str(_yaml_get("telegram", "enabled", default="false")).strip().lower() in ("true", "1", "yes") + TELEGRAM_TOKEN = _yaml_get("telegram", "token", default="") + TELEGRAM_ALLOWED_GROUP_IDS = _as_list(_yaml_get("telegram", "allowed_group_ids", default=[])) + TELEGRAM_SELECTIVE_RESPONSE = str(_yaml_get("telegram", "selective_response", default="true")).strip().lower() in ("true", "1", "yes") + + SERVICE_YAML_PATH = None + + +def load_service_config(char_override=None): + """Override konfigurasi service (xmpp/telegram) dari service.yaml milik + karakter aktif, jika file tersebut ada di agent/characters//. + Memanggil load_character() bila char_override diberikan.""" + global XMPP_ENABLED, XMPP_USERNAME, XMPP_PASSWORD, XMPP_MUC_ROOMS + global XMPP_NICKNAME, XMPP_DEBUG, XMPP_SELECTIVE_RESPONSE + global TELEGRAM_ENABLED, TELEGRAM_TOKEN, TELEGRAM_ALLOWED_GROUP_IDS + global TELEGRAM_SELECTIVE_RESPONSE, SERVICE_YAML_PATH + + _reset_service_from_config() + + if char_override: + load_character(char_override=char_override) + + if not AGENT_CHARACTER: + return + + service_yaml_path = CHARACTERS_DIR / AGENT_CHARACTER / "service.yaml" + + if not service_yaml_path.is_file(): + return + + try: + data = yaml.safe_load(service_yaml_path.read_text(encoding="utf-8")) or {} + if not isinstance(data, dict): + data = {} + except Exception as _e: + print(f"[config] Warning: gagal load service.yaml untuk '{AGENT_CHARACTER}': {_e}", flush=True) + data = {} + + if not data: + return + + SERVICE_YAML_PATH = service_yaml_path + + xmpp_data = data.get("xmpp") or {} + if "enabled" in xmpp_data: + XMPP_ENABLED = str(xmpp_data["enabled"]).strip().lower() in ("true", "1", "yes") + if "username" in xmpp_data: + XMPP_USERNAME = str(xmpp_data["username"]).strip() + if "password" in xmpp_data: + XMPP_PASSWORD = str(xmpp_data["password"]).strip() + if "muc_rooms" in xmpp_data: + XMPP_MUC_ROOMS = _as_list(xmpp_data["muc_rooms"]) + if "nickname" in xmpp_data: + XMPP_NICKNAME = str(xmpp_data["nickname"]).strip() + if "debug" in xmpp_data: + XMPP_DEBUG = str(xmpp_data["debug"]).strip().lower() in ("true", "1", "yes") + if "selective_response" in xmpp_data: + XMPP_SELECTIVE_RESPONSE = str(xmpp_data["selective_response"]).strip().lower() in ("true", "1", "yes") + + telegram_data = data.get("telegram") or {} + if "enabled" in telegram_data: + TELEGRAM_ENABLED = str(telegram_data["enabled"]).strip().lower() in ("true", "1", "yes") + if "token" in telegram_data: + TELEGRAM_TOKEN = str(telegram_data["token"]).strip() + if "allowed_group_ids" in telegram_data: + TELEGRAM_ALLOWED_GROUP_IDS = _as_list(telegram_data["allowed_group_ids"]) + if "selective_response" in telegram_data: + TELEGRAM_SELECTIVE_RESPONSE = str(telegram_data["selective_response"]).strip().lower() in ("true", "1", "yes") + + +# Load character & service dari config.yaml saat import time load_character() +load_service_config() diff --git a/hendrik.py b/hendrik.py index 01ef983..ff9ba00 100644 --- a/hendrik.py +++ b/hendrik.py @@ -79,7 +79,7 @@ def main(): args = parser.parse_args() if args.char: - config.load_character(char_override=args.char) + config.load_service_config(char_override=args.char) if args.workspace: resolved = os.path.abspath(args.workspace)