Fixes, tests improved
Gleb Sinyavsky zhulik.gleb@gmail.com
Sat, 21 Nov 2015 14:22:08 +0300
7 files changed,
101 insertions(+),
101 deletions(-)
M
bot.go
→
bot.go
@@ -405,10 +405,10 @@ return nil
} // ListenForWebhook registers a http handler for a webhook. -func (bot *BotAPI) ListenForWebhook(pattern string) { +func (bot *BotAPI) ListenForWebhook(pattern string) http.Handler { bot.Updates = make(chan Update, 100) - http.HandleFunc(pattern, func(w http.ResponseWriter, r *http.Request) { + handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { bytes, _ := ioutil.ReadAll(r.Body) var update Update@@ -416,6 +416,10 @@ json.Unmarshal(bytes, &update)
bot.Updates <- update }) + + http.HandleFunc(pattern, handler) + + return handler } // SendChatAction sets a current action in a chat.
M
bot_test.go
→
bot_test.go
@@ -3,7 +3,10 @@
import ( "github.com/zhulik/telegram-bot-api" "log" + "net/http" + "net/http/httptest" "os" + "strings" "testing" )@@ -45,6 +48,7 @@
_, err = bot.GetUpdates(u) if err != nil { + t.Log(err.Error()) t.Fail() } }@@ -406,6 +410,44 @@ _, err = bot.GetUserProfilePhotos(tgbotapi.NewUserProfilePhotos(76918703))
if err != nil { t.Fail() } +} + +func TestListenForWebhook(t *testing.T) { + bot, err := tgbotapi.NewBotAPI(os.Getenv("TELEGRAM_API_TOKEN")) + + if err != nil { + t.Fail() + } + + handler := bot.ListenForWebhook("/") + + req, _ := http.NewRequest("GET", "", strings.NewReader("{}")) + w := httptest.NewRecorder() + + handler.ServeHTTP(w, req) + if w.Code != http.StatusOK { + t.Errorf("Home page didn't return %v", http.StatusOK) + } +} + +func TestSetWebhook(t *testing.T) { + bot, err := tgbotapi.NewBotAPI(os.Getenv("TELEGRAM_API_TOKEN")) + + if err != nil { + t.Fail() + } + + wh := tgbotapi.WebhookConfig{Clear: true} + _, err = bot.SetWebhook(wh) + + wh = tgbotapi.NewWebhookWithCert("https://example.com/tgbotapi-test/" + bot.Token, "tests/cert.pem") + _, err = bot.SetWebhook(wh) + if err != nil { + t.Fail() + } + + wh = tgbotapi.WebhookConfig{Clear: true} + _, err = bot.SetWebhook(wh) } func TestUpdatesChan(t *testing.T) {
M
configs.go
→
configs.go
@@ -193,7 +193,7 @@
func (config PhotoConfig) Values() (url.Values, error) { v, _ := config.BaseChat.Values() - v.Add("photo", config.FileID) + v.Add(config.Name(), config.FileID) if config.Caption != "" { v.Add("caption", config.Caption) }@@ -219,7 +219,7 @@
func (config AudioConfig) Values() (url.Values, error) { v, _ := config.BaseChat.Values() - v.Add("audio", config.FileID) + v.Add(config.Name(), config.FileID) if config.Duration != 0 { v.Add("duration", strconv.Itoa(config.Duration)) }@@ -267,7 +267,7 @@
func (config DocumentConfig) Values() (url.Values, error) { v, _ := config.BaseChat.Values() - v.Add("document", config.FileID) + v.Add(config.Name(), config.FileID) return v, nil }@@ -294,7 +294,7 @@
func (config StickerConfig) Values() (url.Values, error) { v, _ := config.BaseChat.Values() - v.Add("sticker", config.FileID) + v.Add(config.Name(), config.FileID) return v, nil }@@ -323,7 +323,7 @@
func (config VideoConfig) Values() (url.Values, error) { v, _ := config.BaseChat.Values() - v.Add("video", config.FileID) + v.Add(config.Name(), config.FileID) if config.Duration != 0 { v.Add("duration", strconv.Itoa(config.Duration)) }@@ -357,7 +357,7 @@
func (config VoiceConfig) Values() (url.Values, error) { v, _ := config.BaseChat.Values() - v.Add("voice", config.FileID) + v.Add(config.Name(), config.FileID) if config.Duration != 0 { v.Add("duration", strconv.Itoa(config.Duration)) }
A
tests/cert.pem
@@ -0,0 +1,18 @@
+-----BEGIN CERTIFICATE----- +MIIC0zCCAbugAwIBAgIJAPYfllX657axMA0GCSqGSIb3DQEBCwUAMAAwHhcNMTUx +MTIxMTExMDQxWhcNMjUwODIwMTExMDQxWjAAMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAoMMSIIgYx8pT8Kz1O8Ukd/JVyqBQYRSo0enqEzo7295VROXq +TUthbEbdi0OczUfl4IsAWppOSRrDwEguJZ0cJ/r6IxGsbrCdQr2MjgiomYtAXKKQ +GAGL5Wls+AzcRNV0OszVJzkDNFYZzgNejyitGJSNEQMyU8r2gyPyIWP9MQKQst8y +Mg91R/7l9jwf6AWwNxykZlYZurtsQ6XsBPZpF9YOFL7vZYPhKUFiNEm+74RpojC7 +Gt6nztYAUI2V/F+1uoXAr8nLpbj9SD0VSwyZLRG1uIVLBzhb0lfOIzAvJ45EKki9 +nejyoXfH1U5+iMzdSAdcy3MCBhpEZwJPqhDqeQIDAQABo1AwTjAdBgNVHQ4EFgQU +JE0RLM+ohLnlDz0Qk0McCxtDK2MwHwYDVR0jBBgwFoAUJE0RLM+ohLnlDz0Qk0Mc +CxtDK2MwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAEmgME00JYuYZ +4wNaGrJskZ05ZnP+TXJusmBui9ToQ4UoykuyY5rsdGQ3SdzXPLdmd2nfMsw63iK2 +D7rjcH/rmn6fRccZqN0o0SXd/EuHeIoeW1Xnnivbt71b6mcOAeNg1UsMYxnMAVl0 +ywdkta8gURltagSfXoUbqlnSxn/zCwqaxxcQXA/CnunvRsFtQrwWjDBPg/BPULHX +DEh2AactGtnGqEZ5iap/VCOVnmL6iPdJ1x5UIF/gS6U96wL+GHfcs1jCvPg+GEwR +3inh9oTXG9L21ge4lbGiPUIMBjtVcB3bXuQbOfec9Cr3ZhcQeZj680BIRxD/pNpA +O/XeCfjfkw== +-----END CERTIFICATE-----
A
tests/key.pem
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY----- +MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQCgwxIgiBjHylPw +rPU7xSR38lXKoFBhFKjR6eoTOjvb3lVE5epNS2FsRt2LQ5zNR+XgiwBamk5JGsPA +SC4lnRwn+vojEaxusJ1CvYyOCKiZi0BcopAYAYvlaWz4DNxE1XQ6zNUnOQM0VhnO +A16PKK0YlI0RAzJTyvaDI/IhY/0xApCy3zIyD3VH/uX2PB/oBbA3HKRmVhm6u2xD +pewE9mkX1g4Uvu9lg+EpQWI0Sb7vhGmiMLsa3qfO1gBQjZX8X7W6hcCvyculuP1I +PRVLDJktEbW4hUsHOFvSV84jMC8njkQqSL2d6PKhd8fVTn6IzN1IB1zLcwIGGkRn +Ak+qEOp5AgMBAAECggEBAJ/dPCJzlEjhL5XPONLmGXzZ1Gx5/VR86eBMv0O9jhb3 +wk2QYO3aPxggZGD/rGcKz1L6hzCR77WM0wpb/N/Um1I6pxHGmnU8VjYvLh10CM0f +h7JWyfnFV+ubagxFJamhpkJuvKyTaldaI7EU8qxj47Xky18Wka53z6nbTgXcW8Sm +V4CJy9OHNgKJQnylX6zOAaxVngSGde3xLslLjsYK4w9b2+OkCSUST2XXdo+ZLXxl +cs0lEPFRM1Xh9/E6UrDrJMHHzio53L/W/+a8sIar1upgSY52pyD/tA7VSrAJ9nYC +RezOU81VTLfMO+TYmgZzSUQJYh0cR4yqJe+wgl4U550CgYEA1EcS6Z+PO5Pr3u2+ +XevawSAal6y9ONkkdOoASC977W37nn0E1wlQo41dR6DESCJfiSMeN0KbmXj5Wnc/ +ADu+73iGwC90G9Qs9sjD7KAFBJvuj0V8hxvpWRdIBBbf7rlOj3CV0iXRYjkJbyJa +cxuR0kiv4gTWmm5Cq+5ir8t1Oc8CgYEAwd+xOaDerNR481R+QmENFw+oR2EVMq3Q +B/vinLK0PemQWrh32iBcd+vhSilOSQtUm1nko1jLK8C4s8X2vZYua4m5tcK9VqCt +maCCq/ffxzsoW/GN8japnduz+qA+hKWJzW/aYR8tsOeqzjVqj4iIqPI4HuokrDi/ +UD/QLgq5UTcCgYEAk2ZC0Kx15dXB7AtDq63xOTcUoAtXXRkSgohV58npEKXVGWkQ +Kk0SjG7Fvc35XWlY0z3qZk6/AuOIqfOxcHUMEPatAtgwlH5RNo+T1EQNF/U6wotq +e9q6vp026XgEyJwt29Y+giy2ZrDaRywgiFs1d0H3t0bKyXMUopQmPJFXdesCgYEA +psCxXcDpZjxGX/zPsGZrbOdxtRtisTlg0k0rp93pO8tV90HtDHeDMT54g2ItzJPr +TMev6XOpJNPZyf6+8GhpOuO2EQkT85u2VYoCeslz95gBabvFfIzZrUZYcnw76bm8 +YjAP5DN+CEfq2PyG0Df+W1ojPSvlKSCSJQMOG1vr81cCgYEAkjPY5WR99uJxYBNI +OTFMSkETgDUbPXBu/E/h5Dtn79v8Moj9FvC7+q6sg9qXhrGhfK2xDev3/sTrbS/E +Gcf8UNIne3AXsoAS8MtkOwJXHkYaTIboIYgDX4LlDmbGQlIRaWgyh2POI6VtjLBT +ms6AdsdpIB6As9xNUBUwj/RnTZQ= +-----END PRIVATE KEY-----
D
tgutils/audio.go
@@ -1,92 +0,0 @@
-// Package tgutils provides extra functions to make certain tasks easier. -package tgutils - -import ( - "github.com/syfaro/telegram-bot-api" - "os" - "os/exec" - "path/filepath" - "strconv" - "sync" - "time" -) - -var rand uint32 -var randmu sync.Mutex - -func reseed() uint32 { - return uint32(time.Now().UnixNano() + int64(os.Getpid())) -} - -func nextSuffix() string { - randmu.Lock() - r := rand - if r == 0 { - r = reseed() - } - r = r*1664525 + 1013904223 // constants from Numerical Recipes - rand = r - randmu.Unlock() - return strconv.Itoa(int(1e9 + r%1e9))[1:] -} - -// this function ripped from ioutils.TempFile, except with a suffix, instead of prefix. -func tempFileWithSuffix(dir, suffix string) (f *os.File, err error) { - if dir == "" { - dir = os.TempDir() - } - - nconflict := 0 - for i := 0; i < 10000; i++ { - name := filepath.Join(dir, nextSuffix()+suffix) - f, err = os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600) - if os.IsExist(err) { - if nconflict++; nconflict > 10 { - randmu.Lock() - rand = reseed() - randmu.Unlock() - } - continue - } - break - } - return -} - -// EncodeAudio takes a file and attempts to convert it to a .ogg for Telegram. -// It then updates the path to the audio file in the AudioConfig. -// -// This function requires ffmpeg and opusenc to be installed on the system! -func EncodeAudio(audio *tgbotapi.AudioConfig) error { - f, err := tempFileWithSuffix(os.TempDir(), "_tgutils.ogg") - if err != nil { - return err - } - defer f.Close() - - ffmpegArgs := []string{ - "-i", - audio.FilePath, - "-f", - "wav", - "-", - } - - opusArgs := []string{ - "--bitrate", - "256", - "-", - f.Name(), - } - - c1 := exec.Command("ffmpeg", ffmpegArgs...) - c2 := exec.Command("opusenc", opusArgs...) - - c2.Stdin, _ = c1.StdoutPipe() - c2.Stdout = os.Stdout - c2.Start() - c1.Run() - c2.Wait() - - return nil -}
M
types_test.go
→
types_test.go
@@ -71,4 +71,4 @@
if file.Link("token") != "https://api.telegram.org/file/bottoken/test/test.txt" { t.Fail() } -}+}