mostly working
This commit is contained in:
105
glist/glist.go
Normal file
105
glist/glist.go
Normal file
@@ -0,0 +1,105 @@
|
||||
package glist
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type Entry struct {
|
||||
Text string `json:"text"`
|
||||
Checked bool `json:"checked"`
|
||||
}
|
||||
|
||||
type GList struct {
|
||||
AllMsgCounter int `json:"-"`
|
||||
Mutex sync.Mutex `json:"-"`
|
||||
ChatID int `json:"chat_id"`
|
||||
MessageID *int `json:"message_id"`
|
||||
Items []Entry `json:"items"`
|
||||
}
|
||||
|
||||
func NewGList(chatID int, items ...string) *GList {
|
||||
g := GList{ChatID: chatID}
|
||||
for _, text := range items {
|
||||
g.Items = append(g.Items, Entry{text, false})
|
||||
}
|
||||
return &g
|
||||
}
|
||||
|
||||
func (g *GList) Add(text string) error {
|
||||
for _, item := range g.Items {
|
||||
if item.Text == text {
|
||||
return fmt.Errorf("dupe:%s", text)
|
||||
}
|
||||
}
|
||||
g.Items = append(g.Items, Entry{text, false})
|
||||
return nil
|
||||
}
|
||||
|
||||
func (g *GList) Toggle(text string) error {
|
||||
for i, item := range g.Items {
|
||||
if item.Text == text {
|
||||
g.Items[i].Checked = !g.Items[i].Checked
|
||||
return nil
|
||||
}
|
||||
}
|
||||
return fmt.Errorf("not found:%s", text)
|
||||
}
|
||||
|
||||
func (g *GList) ClearChecked() {
|
||||
var remaining []Entry
|
||||
for _, item := range g.Items {
|
||||
if !item.Checked {
|
||||
remaining = append(remaining, item)
|
||||
}
|
||||
}
|
||||
g.Items = remaining
|
||||
}
|
||||
|
||||
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 {
|
||||
InlineKeyboard [][]button `json:"inline_keyboard"`
|
||||
} `json:"reply_markup"`
|
||||
}
|
||||
|
||||
func makeButton(e Entry) button {
|
||||
b := button{Text: e.Text, CallbackData: e.Text}
|
||||
if e.Checked {
|
||||
b.Text = fmt.Sprintf("✓ %s", e.Text)
|
||||
}
|
||||
return b
|
||||
}
|
||||
|
||||
func makeButtons(items []Entry) [][]button {
|
||||
var buttons [][]button
|
||||
var current []button
|
||||
for _, item := range items {
|
||||
current = append(current, makeButton(item))
|
||||
if len(current) == 2 {
|
||||
buttons = append(buttons, current)
|
||||
current = []button{}
|
||||
}
|
||||
}
|
||||
if len(current) != 0 {
|
||||
buttons = append(buttons, current)
|
||||
}
|
||||
return buttons
|
||||
}
|
||||
|
||||
func (g *GList) GenSendListReq() ([]byte, error) {
|
||||
req := newListReq{ChatID: g.ChatID, MessageID: g.MessageID, Text: "ok"}
|
||||
itemButtons := makeButtons(g.Items)
|
||||
controlButtons := []button{{"clear checked", "clear"}}
|
||||
req.ReplyMarkup.InlineKeyboard = append(itemButtons, controlButtons)
|
||||
data, err := json.Marshal(req)
|
||||
return data, err
|
||||
}
|
20
glist/glist_test.go
Normal file
20
glist/glist_test.go
Normal file
@@ -0,0 +1,20 @@
|
||||
package glist
|
||||
|
||||
import (
|
||||
"sync"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestGList(t *testing.T) {
|
||||
var ti int
|
||||
var m sync.Mutex
|
||||
g := GList{ti, m, 4342, nil, []Entry{{"foo", true}}}
|
||||
data, err := g.GenSendListReq()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
expected := `{"chat_id":4342,"text":"ok","reply_markup":{"inline_keyboard":[[{"text":"✓ foo","callback_data":"foo"}]]}}`
|
||||
if expected != string(data) {
|
||||
t.Fatalf("expected: %s\n got:%s\n", expected, string(data))
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user