# encoding:utf-8 import os import signal import sys import time from channel import channel_factory from common import const from config import load_config from plugins import * import threading def sigterm_handler_wrap(_signo): old_handler = signal.getsignal(_signo) def func(_signo, _stack_frame): logger.info("signal {} received, exiting...".format(_signo)) conf().save_user_datas() if callable(old_handler): # check old_handler return old_handler(_signo, _stack_frame) sys.exit(0) signal.signal(_signo, func) def start_channel(channel_name: str): channel = channel_factory.create_channel(channel_name) if channel_name in ["wx", "wxy", "terminal", "wechatmp", "wechatmp_service", "wechatcom_app", "wework", const.FEISHU, const.DINGTALK]: PluginManager().load_plugins() if conf().get("use_linkai"): try: from common import linkai_client threading.Thread(target=linkai_client.start, args=(channel,)).start() except Exception as e: pass channel.startup() def run(): try: # load config load_config() # ctrl + c sigterm_handler_wrap(signal.SIGINT) # kill signal sigterm_handler_wrap(signal.SIGTERM) # create channel channel_name = conf().get("channel_type", "wx") if "--cmd" in sys.argv: channel_name = "terminal" if channel_name == "wxy": os.environ["WECHATY_LOG"] = "warn" start_channel(channel_name) while True: time.sleep(1) except Exception as e: logger.error("App startup failed!") logger.exception(e) if __name__ == "__main__": run()