mirror of https://github.com/tucnak/telebot
Message handling: Listen(), AddListener(), Listener
parent
37f537bfab
commit
25b2575f10
@ -0,0 +1,78 @@
|
|||||||
|
package telebot
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
func api_getMe(token string) (User, error) {
|
||||||
|
request := "https://api.telegram.org/bot" + token + "/getMe"
|
||||||
|
|
||||||
|
resp, err := http.Get(request)
|
||||||
|
if err != nil {
|
||||||
|
return User{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer resp.Body.Close()
|
||||||
|
me_json, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return User{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var bot_info struct {
|
||||||
|
Ok bool
|
||||||
|
Result User
|
||||||
|
Description string
|
||||||
|
}
|
||||||
|
|
||||||
|
err = json.Unmarshal(me_json, &bot_info)
|
||||||
|
if err != nil {
|
||||||
|
return User{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if bot_info.Ok {
|
||||||
|
return bot_info.Result, nil
|
||||||
|
} else {
|
||||||
|
return User{}, AuthError{bot_info.Description}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func api_getUpdates(token string,
|
||||||
|
offset int,
|
||||||
|
updates chan<- Update) error {
|
||||||
|
command := fmt.Sprintf("getUpdates?offset=%d", offset)
|
||||||
|
request := "https://api.telegram.org/bot" + token + "/" + command
|
||||||
|
|
||||||
|
resp, err := http.Get(request)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer resp.Body.Close()
|
||||||
|
updates_json, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var updates_recieved struct {
|
||||||
|
Ok bool
|
||||||
|
Result []Update
|
||||||
|
Description string
|
||||||
|
}
|
||||||
|
|
||||||
|
err = json.Unmarshal(updates_json, &updates_recieved)
|
||||||
|
|
||||||
|
if !updates_recieved.Ok {
|
||||||
|
log.Println(FetchError{updates_recieved.Description})
|
||||||
|
return FetchError{updates_recieved.Description}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, update := range updates_recieved.Result {
|
||||||
|
updates <- update
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
package telebot
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Bot struct {
|
||||||
|
Token string
|
||||||
|
|
||||||
|
// Bot as `User` on API level.
|
||||||
|
Identity User
|
||||||
|
|
||||||
|
listeners []Listener
|
||||||
|
}
|
||||||
|
|
||||||
|
type Listener func(*Bot, Message)
|
||||||
|
|
||||||
|
func (b *Bot) Listen(interval time.Duration) {
|
||||||
|
updates := make(chan Update, 1000)
|
||||||
|
var latest_update int
|
||||||
|
|
||||||
|
pulse := time.NewTicker(interval)
|
||||||
|
go func() {
|
||||||
|
for range pulse.C {
|
||||||
|
go api_getUpdates(b.Token,
|
||||||
|
latest_update+1,
|
||||||
|
updates)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
for update := range updates {
|
||||||
|
if update.Id > latest_update {
|
||||||
|
latest_update = update.Id
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, ear := range b.listeners {
|
||||||
|
go ear(b, update.Payload)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *Bot) AddListener(ear Listener) {
|
||||||
|
b.listeners = append(b.listeners, ear)
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
package telebot
|
||||||
|
|
||||||
|
type Message struct {
|
||||||
|
Id int `json:"message_id"`
|
||||||
|
Sender User `json:"from"`
|
||||||
|
Unixtime int `json:"date"`
|
||||||
|
Text string `json:"text"`
|
||||||
|
// TBA: `chat`
|
||||||
|
}
|
Loading…
Reference in New Issue