package plugins import ( "context" "fmt" "io" "io/ioutil" "log" "net/http" "os" "strings" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api" "github.com/neonxp/tamtam" "transport/lib" ) type Telegram struct { Routing []lib.Routing API *tgbotapi.BotAPI Updates chan lib.Message Bus chan lib.Message } func NewTelegram(token string, updates chan lib.Message, bus chan lib.Message, routing []lib.Routing) *Telegram { tgApi, err := tgbotapi.NewBotAPI(token) if err != nil { log.Panic(err) } return &Telegram{API: tgApi, Updates: updates, Bus: bus, Routing: routing} } func (t *Telegram) Run(ctx context.Context) error { u := tgbotapi.NewUpdate(0) u.Timeout = 60 updates, err := t.API.GetUpdatesChan(u) if err != nil { return err } for { select { case <-ctx.Done(): return nil case upd := <-updates: if upd.Message == nil { // ignore any non-Message Updates continue } for _, r := range t.Routing { if r.TgID == upd.Message.Chat.ID { from := fmt.Sprintf("%s %s", upd.Message.From.FirstName, upd.Message.From.LastName) if upd.Message.From.UserName != "" { from = fmt.Sprintf("%s %s (%s)", upd.Message.From.FirstName, upd.Message.From.LastName, upd.Message.From.UserName) } isSticker := "" images := make([]string, 0) if upd.Message.Sticker != nil { isSticker = upd.Message.Sticker.Emoji s, _ := t.API.GetFileDirectURL(upd.Message.Sticker.Thumbnail.FileID) images = append(images, s) } if upd.Message.Photo != nil && len(*upd.Message.Photo) > 0 { p := (*upd.Message.Photo)[0] s, _ := t.API.GetFileDirectURL(p.FileID) images = append(images, s) } t.Bus <- lib.Message{ To: r.TTID, From: from, Text: upd.Message.Text, Images: images, Sticker: isSticker, } } } case msg := <-t.Updates: att := make([]interface{}, 0) for _, a := range msg.Images { att = append(att, tamtam.Image{Url: a}) } text := fmt.Sprintf("*%s*:\n%s", strings.Trim(msg.From, " "), msg.Text) if len(msg.Text) > 0 { res, err := t.API.Send(tgbotapi.MessageConfig{ BaseChat: tgbotapi.BaseChat{ ChatID: msg.To, ReplyToMessageID: 0, }, Text: text, DisableWebPagePreview: false, ParseMode: "markdown", }) log.Printf("[TG] Send text: %#v %#v", res, err) } if len(msg.Images) > 0 { for _, i := range msg.Images { u, err := t.DownloadFile(i) if err != nil { log.Printf("[TG] Download image: %#v", err) continue } m := tgbotapi.NewPhotoUpload(msg.To, u) m.Caption = msg.Sticker res, err := t.API.Send(m) log.Printf("[TG] Send image: %#v %#v", res, err) } } } } } func (t *Telegram) DownloadFile(u string) (string, error) { resp, err := http.Get(u) if err != nil { return "", err } defer resp.Body.Close() // Write the body to file f, err := ioutil.TempFile(os.TempDir(), "tg*") if err != nil { return "", err } _, err = io.Copy(f, resp.Body) defer f.Close() return f.Name(), nil }