diff options
Diffstat (limited to 'plugins/tg.go')
-rw-r--r-- | plugins/tg.go | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/plugins/tg.go b/plugins/tg.go new file mode 100644 index 0000000..ccd3a9b --- /dev/null +++ b/plugins/tg.go @@ -0,0 +1,129 @@ +package plugins + +import ( + "context" + "fmt" + "io" + "io/ioutil" + "log" + "net/http" + "os" + + 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", 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 +} |