欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用Golang + lua实现一个值班机器人

程序员文章站 2022-03-18 16:48:50
我们在的项目组呢,有一项工作是,收邮件(很大程度上使用邮件是为了存个底),然后从我们的系统里边查一下相关信息,然后回复个邮件的工作。虽然工作量并不大,但是会把时间切的稀碎。为了拯救我的时间,所以做了一个邮件的值班机器人。让他来顶替我自动回复邮件,考虑到这个东西应该也有不少人会用得到,所以就把这个东西 ......

我们在的项目组呢,有一项工作是,收邮件(很大程度上使用邮件是为了存个底),然后从我们的系统里边查一下相关信息,然后回复个邮件的工作。虽然工作量并不大,但是会把时间切的稀碎。为了拯救我的时间,所以做了一个邮件的值班机器人。让他来顶替我自动回复邮件,考虑到这个东西应该也有不少人会用得到,所以就把这个东西分享出来。先把效果分享出来。

服务器上就很简单,dutyrobot就是golang编译之后的框架。lua文件夹中就是使用lua编写的业务逻辑。data.json就是保存了一些相关的数据,防止重启之后,数据丢掉,比如说cookie信息。

使用Golang + lua实现一个值班机器人

用最基础的alpine进行启动一下,并且将相关的文件夹映射到容器里边,然后在容器里边启动软件。这么做主要是为了让镜像能够拥有自己的环境变量。

使用Golang + lua实现一个值班机器人

 

 然后业务逻辑里边定期,收邮件,然后判定业务逻辑,执行对应的lua脚本,然后回复邮件。

使用Golang + lua实现一个值班机器人

 

在顺手往我们的内部事务群里边推一条相关结果。

使用Golang + lua实现一个值班机器人

 

 

其实我本职是c#程序员来着,做这个东西,最先也是使用c#来实现的,不过c#跟lua相性不好,我没有找到比较优雅的类库。要上linux系统,用.net core + c 调用lua的方式虽然也尝试过,但是我本身对这件事情还是非常虚的。python的各种包安装都给我搞蒙蔽了。所以最后就选用了golang来写底层函数公布给lua,然后让lua来写各种业务逻辑的方式来实现整个项目。框架部分嘛,一旦写完,改动的几率还是比较低的,并且window交叉编译linux,直接就可以部署上线,连个环境都不用装,简直爽歪歪。lua解释性语言,出了啥都没有以外其他的都挺好的。

基础框架都是通用的,所以可以直接放出来,拿出来用。只需要关心自己的业务内容就可以了。

基础框架:https://gitee.com/anxin1225/dutyrobotgo

在这个框架里边,我给lua提供了不少功能,主要包括收发邮件,发起网络请求,发起网络监听(甚至可以拿这个做底层做一个小型的api站,信我,我这么做过了已经),临时存个数据,获取环境变量,获取文件内容,再启动一个lua容器(没错,lua又再起一个lua容器的能力),获取当前系统信息,cron定时任务。当然如果你觉得不够的话,还可以进行二次扩展,其实非常容易,我已经写了好多了,比着抄一下,很容易的。不过一般情况下不用扩展了,我这边就不深入讲解框架部分了,毕竟,怎么做业务才是重点。

然后,讲一下lua部分是怎么实现的。因为golang里边的代码是直接找到了main.lua进行执行的,我们也就从这个文件开始讲起。

使用Golang + lua实现一个值班机器人

 

 我将好多服务注册了进来,究竟有哪些服务呢,还是得去看看框架里边怎么写的。cron就是我写的其中一个小功能。其实就是task任务,对应到框架部分呢可以查看tasks文件夹里去看具体的实现,可以看到俩边有两个文件,其中task.go是golang的语言函数task_4lua.go就是把golang的函数公开给lua来调用的接口注册的位置。

 

 使用Golang + lua实现一个值班机器人

 

 我们来看到task_4lua.go这个文件里边,一般会存在一个函数叫做registerfunc_4lua就是注册用的。

使用Golang + lua实现一个值班机器人

 

 这就很眼熟了,cron就是lua用的类的名字,下边这个map就是他们对应的需要调用的名字,后边会对照着golang这边的函数,一般函数里边我会写上lua那边应该怎么调用。如果找不到的话,可以来框架这边翻一翻,有惊喜也说不定。

 

 

 使用Golang + lua实现一个值班机器人

我的业务里边。就是每分钟接收一下,每5分钟保存一下cookie。真正的业务逻辑其实就写在各个lua文件里边。我们去看一下怎么接收消息和处理消息的。

 

 

 这里边就是简单的lua的业务逻辑了,收一下邮件,然后调用对应的处理lua,处理完了就完事了。

使用Golang + lua实现一个值班机器人

 

 使用Golang + lua实现一个值班机器人