vk_tg_brodge/internal/vk/vk.go
2024-03-27 18:42:44 +03:00

90 lines
2.3 KiB
Go

package vk
import (
"context"
"fmt"
"log/slog"
"github.com/SevereCloud/vksdk/v2/api"
"github.com/SevereCloud/vksdk/v2/events"
"github.com/SevereCloud/vksdk/v2/longpoll-bot"
)
type VK struct {
api *api.VK
lp *longpoll.LongPoll
}
func New(logger *slog.Logger, api_key string, video_links chan string) (*VK, error) {
const op = "vk.New"
vk := api.NewVK(api_key)
// get information about the group
group, err := vk.GroupsGetByID(nil)
if err != nil {
return nil, fmt.Errorf("cannot get group info: %s: %w", op, err)
}
// Initializing Long Poll
lp, err := longpoll.NewLongPoll(vk, group[0].ID)
if err != nil {
return nil, fmt.Errorf("%s: %w", op, err)
}
// New message event
lp.MessageNew(func(_ context.Context, obj events.MessageNewObject) {
logger.Info("Message", "peer", obj.Message.PeerID, "text", obj.Message.Text)
for _, obj := range obj.Message.Attachments {
objectsw:
switch obj.Type {
case "story":
// fmt.Printf("Story %+v\n", obj.Story.Video.Files)
// get video link from struct
var videolink string
switch {
case obj.Story.Video.Files.Mp4_720 != "":
videolink = obj.Story.Video.Files.Mp4_720
case obj.Story.Video.Files.Mp4_480 != "":
videolink = obj.Story.Video.Files.Mp4_480
case obj.Story.Video.Files.Mp4_360 != "":
videolink = obj.Story.Video.Files.Mp4_360
case obj.Story.Video.Files.Mp4_240 != "":
videolink = obj.Story.Video.Files.Mp4_240
default:
logger.Error("cannot find video link")
break objectsw
}
// fmt.Println("Story:", videolink)
if err != nil {
logger.Error("vk error", "err", err)
}
// send video to tg
video_links <- videolink
case "video":
// logger.Info("Video", "owner", obj.Video.OwnerID, "id", obj.Video.ID)
owner := obj.Video.OwnerID
video_id := obj.Video.ID
videolink, err := fetchVideoURL(owner, video_id)
if err != nil {
logger.Error("cannot get video link", "err", err)
}
video_links <- videolink
default:
logger.Debug("Message type not found", "type", obj.Type, "obj", fmt.Sprintf("%+v", obj))
}
}
})
return &VK{
api: vk,
lp: lp,
}, nil
}
// Run starts message listening.
func (vk *VK) MustRun() {
// Run Bots Long Poll
if err := vk.lp.Run(); err != nil {
panic(err)
}
}