summaryrefslogtreecommitdiff
path: root/plugins/tt.go
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/tt.go')
-rw-r--r--plugins/tt.go107
1 files changed, 107 insertions, 0 deletions
diff --git a/plugins/tt.go b/plugins/tt.go
new file mode 100644
index 0000000..89fa77c
--- /dev/null
+++ b/plugins/tt.go
@@ -0,0 +1,107 @@
+package plugins
+
+import (
+ "context"
+ "fmt"
+ "log"
+
+ "github.com/neonxp/tamtam"
+
+ "transport/lib"
+)
+
+type TamTam struct {
+ Routing []lib.Routing
+ API *tamtam.Api
+ Updates chan lib.Message
+ Bus chan lib.Message
+}
+
+func NewTamTam(token string, updates chan lib.Message, bus chan lib.Message, routing []lib.Routing) *TamTam {
+ return &TamTam{API: tamtam.New(token), Updates: updates, Bus: bus, Routing: routing}
+}
+
+func (t *TamTam) Run(ctx context.Context) error {
+ updates := make(chan interface{}, 1)
+ go func() {
+ if err := t.API.GetUpdatesLoop(ctx, updates); err != nil {
+ log.Printf("[TT] Error: %#v", err)
+ }
+ }()
+ for {
+ select {
+ case <-ctx.Done():
+ return nil
+ case upd := <-updates:
+ log.Printf("[TT] Received: %#v", upd)
+ switch upd := upd.(type) {
+ case tamtam.UpdateMessageCreated:
+ for _, r := range t.Routing {
+ if r.TTID == upd.Message.Recipient.ChatId {
+ from := upd.Message.Sender.Name
+ if upd.Message.Sender.Username != "" {
+ from = fmt.Sprintf("%s (%s)", upd.Message.Sender.Name, upd.Message.Sender.Username)
+ }
+ isSticker := ""
+ images := make([]string, 0)
+ for _, a := range upd.Message.Body.Attachments {
+ switch a := a.(type) {
+ case *tamtam.PhotoAttachment:
+ images = append(images, *a.Payload.Url)
+ case *tamtam.StickerAttachment:
+ images = append(images, a.Payload.Url)
+ isSticker = "СТИКЕР"
+ }
+ }
+ t.Bus <- lib.Message{
+ To: r.TgID,
+ From: from,
+ Text: upd.Message.Body.Text,
+ Images: images,
+ Sticker: isSticker,
+ }
+ }
+ }
+
+ default:
+ log.Printf("Unknown type: %#v", upd)
+ }
+ case msg := <-t.Updates:
+
+ text := fmt.Sprintf("*%s*:\n%s", msg.From, msg.Text)
+ if msg.Sticker != "" {
+ text = fmt.Sprintf("*%s*: [%s]", msg.From, msg.Sticker)
+ }
+ attachments := make([]interface{}, 0, len(msg.Images))
+ if len(msg.Images) > 0 {
+ toSent := []string{}
+ for _, i := range msg.Images {
+ ok := true
+ for _, j := range toSent {
+ if i == j {
+ ok = false
+ }
+ }
+ if ok {
+ toSent = append(toSent, i)
+ }
+ }
+ for _, i := range toSent {
+ attachments = append(attachments, tamtam.PhotoAttachment{
+ Type: "image",
+ Payload: tamtam.PhotoAttachmentPayload{
+ Url: &i,
+ },
+ })
+ }
+ }
+ if len(text) > 0 || len(attachments) > 0 {
+ res, err := t.API.SendMessage(msg.To, msg.To, &tamtam.NewMessageBody{
+ Text: text,
+ Attachments: attachments,
+ })
+ log.Printf("[TT] Answer: %#v %#v", res, err)
+ }
+ }
+ }
+}