4 Commits
v1.0 ... v1.0.2

5 changed files with 52 additions and 14 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
tglistbot*

12
Makefile Normal file
View File

@ -0,0 +1,12 @@
VERSION = $(shell git describe --tags --abbrev=0)
build_release:
CGO_ENABLED=0 go build -buildmode=pie -ldflags "-X main.Version=$(VERSION)" -o tglistbot-$(VERSION)
release_check:
go list -m go.balki.me/tglistbot@$(VERSION)
clean:
rm -i tglistbot* || true

View File

@ -109,16 +109,24 @@ func (g *GList) ClearChecked() {
persistReqC <- g
}
type SendMethod string
var (
NEWLIST SendMethod = "sendMessage"
EDITLIST SendMethod = "editMessageText"
)
type button struct {
Text string `json:"text"`
CallbackData string `json:"callback_data"`
}
type newListReq struct {
ChatID int `json:"chat_id"`
MessageID *int `json:"message_id,omitempty"`
Text string `json:"text"`
ReplyMarkup struct {
ChatID int `json:"chat_id"`
MessageID *int `json:"message_id,omitempty"`
Text string `json:"text"`
DisableNotification *bool `json:"disable_notification,omitempty"`
ReplyMarkup struct {
InlineKeyboard [][]button `json:"inline_keyboard"`
} `json:"reply_markup"`
}
@ -147,8 +155,12 @@ func makeButtons(items []Entry) [][]button {
return buttons
}
func (g *GList) GenSendListReq() ([]byte, error) {
func (g *GList) GenSendListReq(method SendMethod) ([]byte, error) {
req := newListReq{ChatID: g.ChatID, MessageID: g.MessageID, Text: "List:"}
if method == NEWLIST {
disableNotification := true
req.DisableNotification = &disableNotification
}
itemButtons := makeButtons(g.Items)
controlButtons := []button{{"clear checked", "clear"}}
req.ReplyMarkup.InlineKeyboard = append(itemButtons, controlButtons)

View File

@ -7,12 +7,12 @@ import (
func TestGList(t *testing.T) {
g := NewGList(4342, "foo")
data, err := g.GenSendListReq()
data, err := g.GenSendListReq(NEWLIST)
if err != nil {
t.Fatal(err)
}
expected := `{"chat_id":4342,"text":"List:","reply_markup":{"inline_keyboard":[[{"text":"foo","callback_data":"foo"}],[{"text":"clear checked","callback_data":"clear"}]]}}`
expected := `{"chat_id":4342,"text":"List:","disable_notification":true,"reply_markup":{"inline_keyboard":[[{"text":"foo","callback_data":"foo"}],[{"text":"clear checked","callback_data":"clear"}]]}}`
if expected != string(data) {
t.Fatalf("expected: %s\n got:%s\n", expected, string(data))
}

27
main.go
View File

@ -22,14 +22,24 @@ import (
"go.balki.me/tglistbot/glist"
)
// Version will be set from build commandline
var Version string
var apiToken string
var usage string = `Telegram List bot
Environment variables:
TGLB_API_TOKEN (required): See https://core.telegram.org/bots#how-do-i-create-a-bot
TGLB_PORT (default 28923): Set numerical port or unix//run/path.sock for unix socket
TGLB_DATA_PATH (default .): Directory path where list data is stored
`
func main() {
apiToken = os.Getenv("TGLB_API_TOKEN")
if apiToken == "" {
log.Panicln("TG_API_TOKEN is empty")
log.Print(usage)
log.Panicln("TGLB_API_TOKEN is empty")
}
port, unixSocketPath := func() (int, string) {
@ -61,7 +71,10 @@ func main() {
glist.DataPath = dataPath
commit := func() string {
version := func() string {
if Version != "" {
return Version
}
if bi, ok := debug.ReadBuildInfo(); ok {
for _, s := range bi.Settings {
if s.Key == "vcs.revision" {
@ -79,7 +92,7 @@ func main() {
return fmt.Sprintf("port: %v", port)
}()
log.Printf("List bot (%s) starting with datapath: %q, %s\n", commit, dataPath, listeningOn)
log.Printf("List bot (%s) starting with datapath: %q, %s\n", version, dataPath, listeningOn)
var chats sync.Map
if err := loadData(dataPath, &chats); err != nil {
@ -177,7 +190,7 @@ func handleTextAdded(gl *glist.GList, text string) {
gl.Mutex.Lock()
defer gl.Mutex.Unlock()
if count == gl.AllMsgCounter {
resp := sendList(gl, "sendMessage")
resp := sendList(gl, glist.NEWLIST)
if resp == nil {
return
}
@ -219,13 +232,13 @@ func handleButtonClick(gl *glist.GList, messageID int, text string) {
deleteMessage(gl.ChatID, messageID)
gl.MessageID = nil
} else {
sendList(gl, "editMessageText")
sendList(gl, glist.EDITLIST)
}
}
func sendList(gl *glist.GList, method string) []byte {
func sendList(gl *glist.GList, method glist.SendMethod) []byte {
url := fmt.Sprintf("https://api.telegram.org/bot%s/%s", apiToken, method)
sendMsgReq, err := gl.GenSendListReq()
sendMsgReq, err := gl.GenSendListReq(method)
if err != nil {
log.Println(err)
return nil