使用Golang + lua實現一個值班機器人

咱們在的項目組呢,有一項工做是,收郵件(很大程度上使用郵件是爲了存個底),而後從咱們的系統裏邊查一下相關信息,而後回覆個郵件的工做。雖然工做量並不大,可是會把時間切的稀碎。爲了拯救個人時間,因此作了一個郵件的值班機器人。讓他來頂替我自動回覆郵件,考慮到這個東西應該也有很多人會用獲得,因此就把這個東西分享出來。先把效果分享出來。git

服務器上就很簡單,dutyrobot就是Golang編譯以後的框架。lua文件夾中就是使用lua編寫的業務邏輯。Data.json就是保存了一些相關的數據,防止重啓以後,數據丟掉,好比說Cookie信息。程序員

用最基礎的alpine進行啓動一下,而且將相關的文件夾映射到容器裏邊,而後在容器裏邊啓動軟件。這麼作主要是爲了讓鏡像可以擁有本身的環境變量。golang

 

 而後業務邏輯裏邊按期,收郵件,而後斷定業務邏輯,執行對應的lua腳本,而後回覆郵件。json

 

在順手往咱們的內部事務羣裏邊推一條相關結果。服務器

 

 

其實我本職是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

而後,講一下Lua部分是怎麼實現的。由於Golang裏邊的代碼是直接找到了main.lua進行執行的,咱們也就從這個文件開始講起。.net

 

 我將好多服務註冊了進來,究竟有哪些服務呢,仍是得去看看框架裏邊怎麼寫的。Cron就是我寫的其中一個小功能。其實就是task任務,對應到框架部分呢能夠查看tasks文件夾裏去看具體的實現,能夠看到倆邊有兩個文件,其中task.go是Golang的語言函數task_4lua.go就是把Golang的函數公開給lua來調用的接口註冊的位置。

 

 

 

 咱們來看到task_4lua.go這個文件裏邊,通常會存在一個函數叫作RegisterFunc_4lua就是註冊用的。

 

 這就很眼熟了,Cron就是lua用的類的名字,下邊這個map就是他們對應的須要調用的名字,後邊會對照着golang這邊的函數,通常函數裏邊我會寫上lua那邊應該怎麼調用。若是找不到的話,能夠來框架這邊翻一翻,有驚喜也說不定。

 

 

 

個人業務裏邊。就是每分鐘接收一下,每5分鐘保存一下Cookie。真正的業務邏輯其實就寫在各個lua文件裏邊。咱們去看一下怎麼接收消息和處理消息的。

 

 

 這裏邊就是簡單的lua的業務邏輯了,收一下郵件,而後調用對應的處理lua,處理完了就完事了。

 

 

相關文章
相關標籤/搜索