首页
学习
活动
专区
圈层
工具
发布

使用 TypeScript 和依赖注入实现一个聊天机器人

标准Discord欢迎消息 将bot添加到服务器后,你应该会看到如上所示的消息。 创建 .env 文件 我们需要一种能够在自己的程序中保存令牌的方法。为了做到这一点,我们将使用 dotenv 包。...如果你在服务器通道中输入消息,它应该出现在命令行的日志中,如下所示: 1> node src/index.js 2 3Logged in! 4Message received!...为了简单起见,我们的机器人只做一件事:它将扫描传入的消息,如果其中包含单词“ping”,我们将用一个 Discord bot 命令让机器人对那个用户响应“pong! “。...机器人响应包含“ping”一词的消息 这是它在日志中的样子: 1> node src/index.js 2 3Logged in! 4Message received!...消息内容是什么并不重要,所以在测试中我们只使用 "Non-empty string"。

13.2K20

用 SetWindowPos 方法设置一个停止响应的窗口将卡调用方

十分简单的一个方法 询问了一圈了解到,其实这个方法不返回的一个可能的原因是,如果设置的窗口没有处理 Windows 消息,那此 SetWindowPos 方法将不返回。...也就是说阻塞 SetWindowPos 方法的其中一个原因就是和 SendMessage 一样,如果对应的窗口的 Windows 消息没有被读取,那么调用方将被阻塞 重新等待下一次复现。...SetWindowPos 方法阻塞,那么优先调试调用 SetWindowPos 方法传入的窗口句柄参数,通过窗口句柄寻找对应的进程,调查对应的进程是否无响应或者窗口所在的线程没有继续处理 Windows 消息...因此 SetWindowPos 卡住的一个原因就如 SendMessage 的原因,要求只有在对方处理了消息才返回 我写了一个简单的 demo 来复现此问题 先创建两个项目,其中一个项目是 WpfApp1...因为我期望可以通过 VisualStudio 断点调试,跳出循环,也就是让 WpfApp1 进程继续处理 Windows 消息 再新建一个叫 NawnayarlallliwurHifowaleeli 的项目

1.2K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    WPF 警惕 StylusPlugIn 的多线程安全问题

    在 WPF 里面,可以通过 StylusPlugIn 直接从触摸线程获取触摸消息,不需要经过 UI 线程。如此可以实现更低的触摸延迟。...WPF 里面,即使是相同的触摸 Id 值,都可能分别在触摸线程或 UI 线程调入,由于多线程调度问题,可能发生触摸事件是先 Up 后 Down 的情况 为什么在 WPF 里面,可能在 UI 线程将触摸消息调入...为了解决此问题,在 WPF 里面添加了兜底实现逻辑,那就是在 UI 线程判断当前消息是否已经通过 StylusPlugIn 引发了,如果未引发,则补充引发。...这是因为 UI 线程判断消息是否引发是通过时机来决定,如果刚好此时触摸线程没有被 CPU 调度,让 UI 线程更早执行。...我将最简复现 Demo 代码放在本文末尾 再进一步,通过具体的源代码了解此问题复现机制原理 如下图所示,此时触摸消息进入 OnStylusDown 方法的是主线程 一路追踪堆栈,可见这是从主线程的鼠标消息进入触发的

    16210

    ios OC 消息转发机制

    消息转发 机制,程序员可经由此过程告诉对象应该如何处理未知消息。...function_name 方法 二 消息转发的两大阶段     第一阶段先征询接受者所属的类,看其是否能动态添加方法,以处理当前“未知的选择子”,叫做“动态方法解析”。     ...,首先将调用所属类的下列类方法: +(BOOL)resolveInstanceMethod:(SEL)selector 该方法的参数就是未知的选择子,返回类型为Boolean,表示类是否能新增一个实例方法用以处理此选择子...dynamic 属性,比如要访问CoreData框架中NSManagedObjects对象的属性时就可用这么做,因为实现这些属性所需要的存取方法在编译器就能确定 2.2.1 备援接受者     备援接受者为处理未知的选择子提供第二次机会...该步骤对应的处理方法如下: -(id)forwardingTargetForSelector:(SEL)selector 方法参数代码未知的选择子,若当前接受者能找到备援对象,则将其返回,若找不到,就返回

    1K41

    ios OC 消息转发机制

    消息转发 机制,程序员可经由此过程告诉对象应该如何处理未知消息。...function_name 方法 二 消息转发的两大阶段     第一阶段先征询接受者所属的类,看其是否能动态添加方法,以处理当前“未知的选择子”,叫做“动态方法解析”。     ...,首先将调用所属类的下列类方法: +(BOOL)resolveInstanceMethod:(SEL)selector 该方法的参数就是未知的选择子,返回类型为Boolean,表示类是否能新增一个实例方法用以处理此选择子...dynamic 属性,比如要访问CoreData框架中NSManagedObjects对象的属性时就可用这么做,因为实现这些属性所需要的存取方法在编译器就能确定 2.2.1 备援接受者     备援接受者为处理未知的选择子提供第二次机会...该步骤对应的处理方法如下: -(id)forwardingTargetForSelector:(SEL)selector 方法参数代码未知的选择子,若当前接受者能找到备援对象,则将其返回,若找不到,就返回

    59130

    理解消息转发机制

    第一阶段先征询接收者,所属的类,看其是否能动态添加方法,以处理当前这个“未知的选择子”(unknown selector),这叫做“动态方法解析”(dynamic method resolution)。...一,动态方法解析   对象在收到无法解读的消息后,首先将调用其所属类的下列类方法: + (BOOL)resolveInstanceMethod:(SEL)selector   该方法的参数就是那个未知的选择子...二,完整的消息转发   如果运行期系统已经执行完了动态方法解析,消息还没有被处理,那么消息接受者自己就无法再以动态新增方法的形式来响应包含该未知选择子的消息了,此时就进入了第二阶段——完整的消息转发。...运行期系统会请求消息接受者以其他手段来处理与消息相关的方法调用。   1 备援接收者   当前接收者还有第二次机会能处理未知的选择子,在这一步中运行期系统会问它:能不能把这条消息转给其他接收者来处理。...2 完整的消息转发   如果消息还没有被处理,转发算法就会来到这一步。首先创建NSInvocation对象,把尚未处理的那条消息有关的全部细节都封装其中。“消息派发系统”将把消息指派给目标对象。

    70650

    理解消息转发机制

    第一阶段先征询接收者,所属的类,看其是否能动态添加方法,以处理当前这个“未知的选择子”(unknown selector),这叫做“动态方法解析”(dynamic method resolution)。...一,动态方法解析   对象在收到无法解读的消息后,首先将调用其所属类的下列类方法: + (BOOL)resolveInstanceMethod:(SEL)selector   该方法的参数就是那个未知的选择子...二,完整的消息转发   如果运行期系统已经执行完了动态方法解析,消息还没有被处理,那么消息接受者自己就无法再以动态新增方法的形式来响应包含该未知选择子的消息了,此时就进入了第二阶段——完整的消息转发。...运行期系统会请求消息接受者以其他手段来处理与消息相关的方法调用。   1 备援接收者   当前接收者还有第二次机会能处理未知的选择子,在这一步中运行期系统会问它:能不能把这条消息转给其他接收者来处理。...2 完整的消息转发   如果消息还没有被处理,转发算法就会来到这一步。首先创建NSInvocation对象,把尚未处理的那条消息有关的全部细节都封装其中。“消息派发系统”将把消息指派给目标对象。

    1K30

    【ProtoBuf】默认值的秘语注脚:消息更新与兼容之策的进阶实战笺

    验证后发现 新代码序列化的消息(service)也可以被旧代码(client)解析。 并且这里要说的是,新增的 ‘生日’字段在旧程序(client)中其实并没有丢失,而是会作为旧程序的未知字段。...未知字段:解析结构良好的 protocol buffer 已序列化数据中的未识别字段的表示方式。...例如,当旧程序解析带有新字段的数据时,这些新字段就会成为旧程序的未知字段 本来,proto3 在解析消息时总是会丢弃未知字段,但在 3.5 版本中重新引入了对未知字段的保留机 制。...所以在3.5或更高版本中,未知字段在反序列化时会被保留,同时也会包含在序列化的结果中 3.1 未知字段从哪获取 MessageLite 类介绍(了解) MessageLite 从名字看是轻量级的...类介绍(重要) 表示未知字段集中的一个字段。

    16010

    【iOS】运行时消息传递与转发机制

    (二)消息转发流程 上面讲到了对象的消息传递机制,如果在整个类的继承体系中还是找不到与选择子相符的方法,也就是对象或者类对象收到了无法解读的消息,那么就会进入到消息转发环节。...当对象接收到无法解读的消息后,就会启动“消息转发(message forwarding)”机制,我们可以在消息转发过程中告诉对象应该如处理未知消息。 消息转发分为两个阶段。...(2.1)动态方法解析 动态方法解析的意思就是,征询消息接受者所属的类,看其是否能动态添加方法,以处理当前“这个未知的选择子(unknown selector)“。...,如下: + (BOOL)resolveClassMethod:(SEL)selector 如果运行期系统已经执行完了动态方法解析,那么消息接受者自己就无法再以动态新增方法的形式来响应包含该未知选择子的消息了...:(SEL)selector 方法参数代表未知的选择子,返回值为备援接受者,若当前接受者能找到备援接受者,就直接返回,这个未知的选择子将会交由备援接受者处理。

    8.6K50

    iOS进阶之消息转发机制

    前言: iOS进阶之传递消息 上篇讲到消息传递,其中有个问题:对象在收到无法解读的消息之后会发生什么情况? 若想令类能理解某条消息,我们必须以程序码实现出对应的方法才行。...第一阶段先征询接收者,所属的类,看其是否能动态添加方法,以处理当前这个“未知的选择子”,这叫做“动态方法解析”。第二阶段涉及“完整的消息转发机制”。...动态方法解析 对象在收到无法解读的消息后,首先将调用其所类的下列类方法: + (BOOL)resolveInstanceMethod:(SEL)selector 该方法的参数就是那个未知的选择子,...备援接受者 当前接收者还有第二次机会能处理未知的选择子,在这一步中,运行期系统会问它:能不能把这条消息转给其他接收者来处理。...与该步骤对应的处理方法如下: - (id)forwardingTargetForSelector:(SEL)aSelector 方法参数代表未知的选择子,若当前接收者能找到备援对象,则将其返回,则将其返回

    97560

    【RocketMQ系列(三)】基于RocketMQ的分布式事务

    检查事务状态 Broker会开启一个定时任务,消费RMQ_SYS_TRANS_HALF_TOPIC队列中的消息,每次执行任务会向Producer确认事务执行状态(提交、回滚、未知),如果是未知,等待下一次回调...事务消息的三种状态 提交状态:提交事务,它允许消费者消费此消息。 回滚状态:回滚事务,它代表该消息将被删除,不允许被消费。 未知状态:中间状态,它代表需要检查消息队列来确定状态。...因为预备消息最终肯定会变为Commit消息或Rollback消息,所以遍历预备消息去回查本地业务的执行状态,如果发现本地业务没有执行成功就Rollback,如果执行成功就发送Commit消息。...,使用executeLocalTransaction方法来执行本地事务,返回前文所述的三种状态之一:提交、回滚、未知。...checkLocalTransaction方法用于检查本地事务状态,并回应消息队列的检查请求,该方法也返回提交、回滚、未知三种状态之一。

    2.1K20

    RocketMQ特性--事物消息【源码笔记】

    2.事务半消息存储代码分析(一) 3.事务半消息存储代码分析(二) 四、事务消息服务端响应结束事务请求 1.处理未知类型请求 2.处理事务提交请求 3.处理事务回滚请求 五、事务消息服务端状态回查 1...ROLLBACK_MESSAGE: requestHeader.setCommitOrRollback(MessageSysFlag.TRANSACTION_ROLLBACK_TYPE); break; //@4 设置事务未知标记...localTransactionState,调用结束事务方法 @2 requestHeader设置事务提交标记0x2 << 2=8 @3 requestHeader设置事务回滚标记0x3 << 2=12 @4 requestHeader设置未知标记...四、事务消息服务端响应结束事务请求 1.处理未知类型请求 方法:EndTransactionProcessor#processRequest case MessageSysFlag.TRANSACTION_NOT_TYPE...RMQ_SYS_TRANS_HALF_TOPIC中,由于本次回查尚未知道结果,所以进行存储。

    1.2K10

    我也曾对架构师的力量一无所知

    其实吧,那个消息网关系统曾经是我和架构组兄弟花不少力气设计的,本身并没有什么大问题,最多就是随着消息数量的指数级上升,需要做一些性能优化。...——微服务体系的流量控制 “个人交易消息和全局活动消息,如何存储和查询?” ——时间和空间的抉择 ” 结果我得到的回复只是线程池、异步化和缓存的泛泛之谈,离真正的落地还差的很远。...因为面对黑不见底的海水,我们充满了对未知的恐惧。 ? 百度有时也挺人性的 IT行业的未知每天都在发生着,经常让我们手忙脚乱。 何谓"未知"?...而架构师的核心职责之一就是从容的解决未知。 对大家来说一样都是未知,凭啥架构师就有勇气从容应对? 原因很简单,架构师的身后哪里还有人?不得死撑哇!...RocketMQ当初参照了Kafka,在牺牲了部分性能的情况下优化了投递时效、消息顺序、消息轨迹等; TiDB 是基于 Google Spanner / F1 论文实现的开源分布式 NewSQL 数据库

    56830
    领券