149 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package main
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"errors"
 | |
| 	"fmt"
 | |
| 	"io"
 | |
| 	"log"
 | |
| 	"math/rand"
 | |
| 	"net/http"
 | |
| 	"os"
 | |
| 	"strings"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/kosa3/pexels-go"
 | |
| 	"github.com/mattn/go-mastodon"
 | |
| 	"github.com/spf13/viper"
 | |
| )
 | |
| 
 | |
| func main() {
 | |
| 	architectureBot()
 | |
| }
 | |
| 
 | |
| func architectureBot() {
 | |
| 	viper.AddConfigPath(".")
 | |
| 	viper.AddConfigPath("..")
 | |
| 	viper.SetConfigName("architectureBot") // name of config file (without extension)
 | |
| 	viper.SetConfigType("yaml")            // REQUIRED if the config file does not have the extension in the name
 | |
| 	err := viper.ReadInConfig()            // Find and read the config file
 | |
| 	if err != nil {                        // Handle errors reading the config file
 | |
| 		panic(fmt.Errorf("fatal error config file: %w", err))
 | |
| 	}
 | |
| 
 | |
| 	type fedi struct {
 | |
| 		clientID     string
 | |
| 		clientSecret string
 | |
| 		email        string
 | |
| 		password     string
 | |
| 	}
 | |
| 
 | |
| 	rand.Seed(time.Now().UnixNano())
 | |
| 
 | |
| 	queryArr := viper.GetStringSlice("queries")
 | |
| 	queryArrLen := len(queryArr)
 | |
| 	queryIndex := rand.Int31n(int32(queryArrLen))
 | |
| 	query := queryArr[queryIndex]
 | |
| 
 | |
| 	cli := pexels.NewClient(viper.GetString("PexelsAPIKey"))
 | |
| 	ps, err := cli.PhotoService.Search(context.Background(), &pexels.PhotoParams{
 | |
| 		Query:   query,
 | |
| 		PerPage: 80,
 | |
| 	})
 | |
| 	if err != nil {
 | |
| 		log.Fatal(err)
 | |
| 	}
 | |
| 	ps.Page = rand.Intn(100)
 | |
| 	photoIndex := rand.Intn(79)
 | |
| 	photo := ps.Photos[photoIndex]
 | |
| 
 | |
| 	// fmt.Println("Source Medium URL:", ps.Photos[0].Src.Medium)
 | |
| 	photoURL := photo.Src.Original
 | |
| 	mime := strings.Split(photoURL, "/")
 | |
| 	name := mime[len(mime)-1]
 | |
| 	fileName := "images/" + fmt.Sprint(name)
 | |
| 	os.Mkdir("images", 0700)
 | |
| 	err = downloadFile(photoURL, fileName)
 | |
| 	if err != nil {
 | |
| 		log.Fatal(err)
 | |
| 	}
 | |
| 
 | |
| 	// fmt.Println("Original SRC URL: ", photoURL)
 | |
| 
 | |
| 	post := "Taken from " + photo.URL + "\n#neoclassical"
 | |
| 
 | |
| 	domain := "https://" + viper.GetString("domain")
 | |
| 	if !viper.IsSet("NCD.ClientID") {
 | |
| 
 | |
| 		app, err := mastodon.RegisterApp(context.Background(), &mastodon.AppConfig{
 | |
| 			Server:     domain,
 | |
| 			ClientName: viper.GetString("botName"),
 | |
| 			Scopes:     "read write follow",
 | |
| 		})
 | |
| 
 | |
| 		if err != nil {
 | |
| 			log.Fatal(err)
 | |
| 		}
 | |
| 
 | |
| 		viper.Set("NCD.ClientID", app.ClientID)
 | |
| 		viper.Set("NCD.ClientSecret", app.ClientSecret)
 | |
| 		viper.WriteConfig()
 | |
| 	}
 | |
| 	ncdConfig := fedi{
 | |
| 		clientID:     viper.GetString("NCD.ClientID"),
 | |
| 		clientSecret: viper.GetString("NCD.ClientSecret"),
 | |
| 		email:        viper.GetString("NCD.Email"),
 | |
| 		password:     viper.GetString("NCD.password"),
 | |
| 	}
 | |
| 
 | |
| 	c := mastodon.NewClient(&mastodon.Config{
 | |
| 		Server:       domain,
 | |
| 		ClientID:     ncdConfig.clientID,
 | |
| 		ClientSecret: ncdConfig.clientSecret,
 | |
| 	})
 | |
| 
 | |
| 	err2 := c.Authenticate(context.Background(), ncdConfig.email, ncdConfig.password)
 | |
| 	if err2 != nil {
 | |
| 		log.Fatal(err)
 | |
| 	}
 | |
| 
 | |
| 	attachment, err4 := c.UploadMedia(context.Background(), fileName)
 | |
| 	if err4 != nil {
 | |
| 		fmt.Println(err4)
 | |
| 	}
 | |
| 	var attachmentArr []mastodon.ID
 | |
| 	attachmentArr = append(attachmentArr, attachment.ID)
 | |
| 	status := &mastodon.Toot{
 | |
| 		Status:   post,
 | |
| 		MediaIDs: attachmentArr,
 | |
| 	}
 | |
| 	c.PostStatus(context.Background(), status)
 | |
| }
 | |
| 
 | |
| func downloadFile(URL, fileName string) error {
 | |
| 	//Get the response bytes from the url
 | |
| 	response, err := http.Get(URL)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	defer response.Body.Close()
 | |
| 
 | |
| 	if response.StatusCode != 200 {
 | |
| 		return errors.New("received non 200 response code")
 | |
| 	}
 | |
| 	//Create a empty file
 | |
| 	file, err := os.Create(fileName)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	defer file.Close()
 | |
| 
 | |
| 	//Write the bytes to the fiel
 | |
| 	_, err = io.Copy(file, response.Body)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 
 | |
| 	return nil
 | |
| }
 | 
