---
# System prepended metadata

title: LEDB Go Project

---

# LEDB Go Project

## Overview
LEDB Go是LED的聊天機器人，通過Line api來接收跟回復訊息，除了資料查詢之外，也可以作為工作內容紀錄以及請假系統，還能定時提醒相關事項


## Installation
要執行LEDB Go，你需要完成以下步驟:

1. 下載程式碼:
    ```sh
    git@github.com:ethel047/LEDB_go.git
    ```
2. 進入資料夾:
    ```sh
    cd LEDB_go
    ```
3. 安裝需要的資源庫:
    ```sh
    go mod download
    ```
4. 修改config.go中的channelSecret跟accessToken，要改成你測試用的line帳號(你要去LINE API獲取)，如果你要用LEDB的line帳號測試就不用改
    ```sh
    // config.go
    // func InitBot()
	channelSecret := "YOUR_channelSecret"
	accessToken := "YOUR_accessToken"
    ```
5. 執行go server
    ```sh
    go run app.go
    ``` 
6. 設定轉傳，現在line那邊的訊息還沒有辦法傳給你，因為你沒有跟他說要傳到哪裡，所以透過ngrok來設定轉傳，進入https://ngrok.com/，登入後他會有教學，最後執行
    ```sh
    ngrok http 5000
    ``` 
    ngrok會回傳給你一個類似這樣的東西
    ```sh
    Session Status
    
    online
    
    Account
    
    daniel29348679@gmail.com(Plan:Free)
    
    Version3.184
    
    Region                        Japan (jp)
    
    Interface                 http://127.0.0.1:4040                                                                   
    
    Forwarding                    https://15d8-61-231-156-128.ngrok-free.app -> http://localhost:5000   
    ```

    其中https://15d8-61-231-156-128.ngrok-free.app就是他的轉傳接收網址

    你要把它貼到你的line bot webhook中

7.你的‘server應該能順利執行了 

## 運作流程

### 接收訊息：
LINE那邊的server接收到訊息的時候，會透過http向你設定的webhook傳送訊息，你需要寫一個api去接收，我們的做法是傳送到message.go去處理．Handlethread()是處理message的主程式，他透過chan接收資料。

chan是go的語言特色，簡單來說他是一個線程間交換資料的通道，可以參考https://vocus.cc/article/650069fcfd89780001f38f5b

你應該要很熟悉chan因為在這個project中有大量使用

在Handlethread()中，迴圈內的形式即是有限狀態機，他可以讓對話依照流程進行，當你要新增功能時，應該要現在這裡新增或是修改對話內容．

在我的設計中，每一個user都會對應一個thread(go goroutine)，會這樣設計是為了效能跟變數設計方便，每個user都會有自己對應的變數儲存在Handlethread()中．

### 讀取跟寫入試算表
由於go中沒有await,async我使用另一個方法來達成類似效果
```sh
retchen := make(chan [][]string, 1)
go ReadSheetThread(config.WorkRecordId, "工作表1", "B:B", retchen)
ret := <-retchen // 讀取的表格會回傳到ret
```

寫入表格則使用WriteSheetThread()，你可以去Recordwork中找到他的用法，因為太長了不在此贅述

### 傳送訊息
我寫好了一個thread，他會自動把傳送到chan中的資料轉發出去，你只要往chan中塞資料即可
````
Sendmessagechan <- StringPair{"品元", "Bot已啟動"} 
````
