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) } }