package main import ( "bytes" "encoding/json" "fmt" "io" "log" "net/http" "sync" "time" "gitea.balki.me/telegram-msgchkbox/glist" ) var apiToken = "421791796:AAE4wPbcqfLP1GNeGR3RTBiyX16fCj3HPAM" func main() { var chats sync.Map fmt.Println("vim-go") http.HandleFunc("/zeexkfcsdjpmncirkyelwzotjmmefcqtcogrfwnafidionxiacwnslwuhbwfuppjgwzbmazd", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("ok")) body, err := io.ReadAll(r.Body) if err != nil { log.Println(err) return } log.Println(string(body)) update := struct { Message *struct { ID int `json:"message_id"` Chat struct { ID int `json:"id"` } Text string } CallbackQuery *struct { ID string `json:"id"` Message struct { ID int `json:"message_id"` Chat struct { ID int `json:"id"` } } Data string } `json:"callback_query"` }{} err = json.Unmarshal(body, &update) if err != nil { log.Println(err) return } if update.Message != nil { chatID := update.Message.Chat.ID g, _ := chats.LoadOrStore(chatID, glist.NewGList(chatID)) gl := g.(*glist.GList) go handleTextAdded(gl, update.Message.Text) } else if update.CallbackQuery != nil { defer func() { go answerCallbackQuery(update.CallbackQuery.ID) }() chatID := update.CallbackQuery.Message.Chat.ID g, ok := chats.Load(chatID) if !ok { log.Println("Chat not found: %s", chatID) return } gl := g.(*glist.GList) go handleButtonClick(gl, update.CallbackQuery.Message.ID, update.CallbackQuery.Data) } }) port := 28923 log.Panic(http.ListenAndServe(fmt.Sprintf(":%v", port), nil)) } func handleTextAdded(gl *glist.GList, text string) { gl.Mutex.Lock() defer gl.Mutex.Unlock() gl.Add(text) count := gl.AllMsgCounter + 1 gl.AllMsgCounter = count time.AfterFunc(30*time.Second, func() { gl.Mutex.Lock() defer gl.Mutex.Unlock() if count == gl.AllMsgCounter { sendList(gl, "sendMessage") } }) } func handleButtonClick(gl *glist.GList, messageID int, text string) { gl.Mutex.Lock() defer gl.Mutex.Unlock() if gl.MessageID != nil { if messageID != *gl.MessageID { go deleteMessage(gl.ChatID, *gl.MessageID) } } gl.MessageID = &messageID if text == "clear" { gl.ClearChecked() } else { gl.Toggle(text) } if len(gl.Items) == 0 { deleteMessage(gl.ChatID, messageID) } else { sendList(gl, "editMessageText") } } func sendList(gl *glist.GList, method string) { url := fmt.Sprintf("https://api.telegram.org/bot%s/%s", apiToken, method) sendMsgReq, err := gl.GenSendListReq() if err != nil { log.Println(err) return } resp, err := http.Post(url, "application/json", bytes.NewReader(sendMsgReq)) if err != nil { log.Println(err) return } logBody(resp.Body) } func answerCallbackQuery(callbackQueryID string) { answerUrl := fmt.Sprintf("https://api.telegram.org/bot%s/answerCallbackQuery?callback_query_id=%stext=ok", apiToken, callbackQueryID) resp, err := http.Get(answerUrl) if err != nil { log.Println(err) return } logBody(resp.Body) } func deleteMessage(chatID int, messageID int) { deleteUrl := fmt.Sprintf("https://api.telegram.org/bot%s/deleteMessage?chat_id=%d&message_id=%d", apiToken, chatID, messageID) resp, err := http.Get(deleteUrl) if err != nil { log.Println(err) return } logBody(resp.Body) } func logBody(respBody io.ReadCloser) { defer func() { err := respBody.Close() if err != nil { log.Println(err) } }() body, err := io.ReadAll(respBody) if err != nil { log.Println(err) return } log.Println(string(body)) } /* Example data update_id: 547400623 message: message_id: 869 from: id: 385713421 is_bot: false first_name: Balakrishnan language_code: en chat: id: -832015899 title: Playbot type: group all_members_are_administrators: true date: 1671850862 text: Hi update_id: 547400624 callback_query: id: "1656626530601531051" from: id: 385713421 is_bot: false first_name: Balakrishnan language_code: en message: message_id: 868 from: id: 421791796 is_bot: true first_name: grocery_guy username: grocery_guy_bot chat: id: -832015899 title: Playbot type: group all_members_are_administrators: true date: 1671074930 text: foo reply_markup: inline_keyboard: - - text: blah callback_data: "42" chat_instance: "5165047605234327446" data: "42" */