/// <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 }; }
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(); }
public GrpcPuppet(PuppetOptions _options, ILogger <WechatyPuppet> _logger, ILoggerFactory loggerFactory) : base(_options, _logger, loggerFactory) { options = _options; logger = _logger; }
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); }