Example #1
0
        /// <summary>
        /// init <see cref="Wechaty"/> with <see cref="WechatyPuppetOptions"/>
        /// </summary>
        /// <param name="options"></param>
        /// <param name="loggerFactory"></param>
        public Wechaty(PuppetOptions options)
        {
            //ILoggerFactory loggerFactory = new LoggerFactory();


            var loggerFactory = LoggerFactory.Create(builder =>
            {
                builder
                .AddConsole();
            });

            var logger = new Logger <WechatyPuppet>(loggerFactory);

            var grpcPuppet = new GrpcPuppet(options, logger, loggerFactory);

            var wechatyOptions = new WechatyPuppetOptions()
            {
                Name   = options.Name,
                Puppet = grpcPuppet,
            };


            _options = wechatyOptions;

            _loggerFactory = loggerFactory;
            _logger        = loggerFactory.CreateLogger <Wechaty>();


            if (_logger.IsEnabled(LogLevel.Trace))
            {
                _logger.LogTrace("constructor() WechatyOptions.profile DEPRECATED. use WechatyOptions.name instead.");
            }
            if (string.IsNullOrWhiteSpace(options.Name))
            {
                if (_logger.IsEnabled(LogLevel.Trace))
                {
                    _logger.LogTrace("constructor()");
                }
            }
            _memory     = _options.Memory;
            Id          = Guid.NewGuid().ToString();
            State       = new StateSwitch("Wechaty", loggerFactory.CreateLogger <StateSwitch>());
            _readyState = new StateSwitch("WechatyReady", loggerFactory.CreateLogger <StateSwitch>());

            Contact        = new ContactRepository(loggerFactory.CreateLogger <Contact>(), this, loggerFactory.CreateLogger <ContactRepository>());
            Tag            = new TagRepository(loggerFactory.CreateLogger <Tag>(), this, loggerFactory.CreateLogger <TagRepository>());
            ContactSelf    = new ContactSelfRepository(loggerFactory.CreateLogger <ContactSelf>(), this, loggerFactory.CreateLogger <ContactSelfRepository>());
            Friendship     = new FriendshipRepository(loggerFactory.CreateLogger <Friendship>(), this, loggerFactory.CreateLogger <FriendshipRepository>());
            Message        = new MessageRepository(loggerFactory.CreateLogger <Message>(), this, loggerFactory.CreateLogger <MessageRepository>());
            Image          = new ImageRepository(loggerFactory.CreateLogger <Image>(), this, loggerFactory.CreateLogger <ImageRepository>());
            RoomInvitation = new RoomInvitationRepository(loggerFactory.CreateLogger <RoomInvitation>(), this, loggerFactory.CreateLogger <RoomInvitationRepository>());
            Room           = new RoomRepository(loggerFactory.CreateLogger <Room>(), this, loggerFactory.CreateLogger <RoomRepository>());
            UrlLink        = new UrlLinkRepository(this, loggerFactory.CreateLogger <UrlLinkRepository>());
            MiniProgram    = new MiniProgramRepository();

            InstallGlobalPlugin();
        }
 public void Instance(PuppetOptions options)
 {
     puppetOptions = new PuppetOptions()
     {
         EndPoint = options.EndPoint,
         Timeout  = options.Timeout == 0 ? 60000 : options.Timeout,
         Token    = options.Token,
         Name     = options.Name
     };
 }
Example #3
0
        public async Task StartAsync(CancellationToken cancellationToken)
        {
            var PuppetOptions = new PuppetOptions()
            {
                Token = _configuration["WECHATY_PUPPET_HOSTIE_TOKEN"],
                //PuppetService = _configuration["WECHATY_PUPPET"]
                Endpoint = _configuration["WECHATY_ENDPOINT"]
            };

            bot = new Wechaty.Wechaty(PuppetOptions);

            await bot.OnScan(WechatyScanEventListener)
            .OnLogin(WechatyLoginEventListener)
            .OnMessage(WechatyMessageEventListenerAsync)
            .OnHeartbeat(WechatyHeartbeatEventListener)
            .Start();
        }
Example #4
0
 public GrpcPuppet(PuppetOptions _options, ILogger <WechatyPuppet> _logger, ILoggerFactory loggerFactory)
     : base(_options, _logger, loggerFactory)
 {
     options = _options;
     logger  = _logger;
 }
Example #5
0
        protected Puppet(PuppetOptions options, ILogger <Puppet> logger, ILoggerFactory loggerFactory)
        {
            Options = options;
            Logger  = logger;
            State   = new StateSwitch(GetType().Name, loggerFactory.CreateLogger <StateSwitch>());
            Memory  = new MemoryCard((MemoryCardOptions?)null, loggerFactory.CreateLogger <MemoryCard>(), loggerFactory);
            //load here is for testing only
            Memory.Load()
            .ContinueWith(task =>
            {
                if (!task.IsFaulted)
                {
                    if (Logger.IsEnabled(LogLevel.Trace))
                    {
                        Logger.LogTrace("constructor() memory.load() done");
                    }
                }
                else
                {
                    Logger.LogWarning("constructor() memory.load() rejection", task.Exception);
                }
            });
            // 1. Setup Watchdog
            // puppet implementation class only need to do one thing:
            // feed the watchdog by `this.emit('heartbeat', ...)`
            Watchdog = new Watchdog <object, EventHeartbeatPayload>(loggerFactory.CreateLogger <Watchdog <object, EventHeartbeatPayload> >());
            _        = this.On <Puppet, EventHeartbeatPayload>("heartbeat", payload => _ = Watchdog.Feed(payload));
            _        = Watchdog
                       .On <Watchdog <object, EventHeartbeatPayload>, EventHeartbeatPayload>("reset", lastFood =>
            {
                Logger.LogWarning($"constructor() watchdog.on(reset) reason: {JsonConvert.SerializeObject(lastFood)}");
                _ = Emit("reset", lastFood);
            });
            // 2. Setup `reset` Event via a 1 second Throttle Queue:
            _resetThrottleQueue = new ThrottleQueue <string>(TimeSpan.FromSeconds(1));

            // 2.2. handle all `reset` events via the resetThrottleQueue
            _ = this.On <Puppet, EventHeartbeatPayload>("reset", payload =>
            {
                if (Logger.IsEnabled(LogLevel.Trace))
                {
                    Logger.LogTrace($"constructor() this.on(reset) payload: {JsonConvert.SerializeObject(payload)}");
                }
                _resetThrottleQueue.OnNext(payload.Data);
            });

            // 2.3. call reset() and then ignore the following `reset` event for 1 second
            _resetThrottleQueue.Subscribe(reason =>
            {
                if (Logger.IsEnabled(LogLevel.Trace))
                {
                    Logger.LogTrace($"constructor() resetThrottleQueue.subscribe() reason: \"{reason}\"");
                }
                Reset(reason);
            });

            // 3. Setup LRU Caches
            CacheContactPayload        = new LRUCache <string, ContactPayload>(3000);
            CacheFriendshipPayload     = new LRUCache <string, FriendshipPayload>(3000);
            CacheMessagePayload        = new LRUCache <string, MessagePayload>(3000);
            CacheRoomPayload           = new LRUCache <string, RoomPayload>(3000);
            CacheRoomMemberPayload     = new LRUCache <string, RoomMemberPayload>(3000);
            CacheRoomInvitationPayload = new LRUCache <string, RoomInvitationPayload>(3000);
        }