zveinn 1 year ago
parent
commit
794397b225
8 changed files with 100 additions and 14 deletions
  1. 6 0
      go.mod
  2. 20 0
      go.sum
  3. 10 2
      main.go
  4. 1 1
      mongowrapper/mongowrapper.go
  5. BIN
      twitch-bot.exe
  6. 24 3
      twitch-client.go
  7. 38 7
      twitch-core.go
  8. 1 1
      variables.go

+ 6 - 0
go.mod

@@ -4,21 +4,27 @@ go 1.21.1
 
 require (
 	github.com/gempir/go-twitch-irc/v4 v4.0.0
+	github.com/gopxl/beep v1.4.0
 	github.com/joho/godotenv v1.5.1
 	github.com/nicklaw5/helix v1.25.0
 	go.mongodb.org/mongo-driver v1.13.0
 )
 
 require (
+	github.com/ebitengine/oto/v3 v3.1.0 // indirect
+	github.com/ebitengine/purego v0.5.0 // indirect
 	github.com/golang-jwt/jwt v3.2.1+incompatible // indirect
 	github.com/golang/snappy v0.0.1 // indirect
+	github.com/hajimehoshi/go-mp3 v0.3.4 // indirect
 	github.com/klauspost/compress v1.13.6 // indirect
 	github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect
+	github.com/pkg/errors v0.9.1 // indirect
 	github.com/xdg-go/pbkdf2 v1.0.0 // indirect
 	github.com/xdg-go/scram v1.1.2 // indirect
 	github.com/xdg-go/stringprep v1.0.4 // indirect
 	github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
 	golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect
 	golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect
+	golang.org/x/sys v0.12.0 // indirect
 	golang.org/x/text v0.7.0 // indirect
 )

+ 20 - 0
go.sum

@@ -1,5 +1,9 @@
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/ebitengine/oto/v3 v3.1.0 h1:9tChG6rizyeR2w3vsygTTTVVJ9QMMyu00m2yBOCch6U=
+github.com/ebitengine/oto/v3 v3.1.0/go.mod h1:IK1QTnlfZK2GIB6ziyECm433hAdTaPpOsGMLhEyEGTg=
+github.com/ebitengine/purego v0.5.0 h1:JrMGKfRIAM4/QVKaesIIT7m/UVjTj5GYhRSQYwfVdpo=
+github.com/ebitengine/purego v0.5.0/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ=
 github.com/gempir/go-twitch-irc/v4 v4.0.0 h1:sHVIvbWOv9nHXGEErilclxASv0AaQEr/r/f9C0B9aO8=
 github.com/gempir/go-twitch-irc/v4 v4.0.0/go.mod h1:QsOMMAk470uxQ7EYD9GJBGAVqM/jDrXBNbuePfTauzg=
 github.com/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c=
@@ -8,6 +12,11 @@ github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
 github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM=
 github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/gopxl/beep v1.4.0 h1:pJERVDZMJkf49R1g/tV9DhVct4xNRuTlyMnMa53gGsc=
+github.com/gopxl/beep v1.4.0/go.mod h1:gGVz7MJKlfHrmkzr0wSLGNyY7oisM6rFWJnaLjNxEwA=
+github.com/hajimehoshi/go-mp3 v0.3.4 h1:NUP7pBYH8OguP4diaTZ9wJbUbk3tC0KlfzsEpWmYj68=
+github.com/hajimehoshi/go-mp3 v0.3.4/go.mod h1:fRtZraRFcWb0pu7ok0LqyFhCUrPeMsGRSVop0eemFmo=
+github.com/hajimehoshi/oto/v2 v2.3.1/go.mod h1:seWLbgHH7AyUMYKfKYT9pg7PhUu9/SisyJvNTT+ASQo=
 github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
 github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
 github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc=
@@ -16,6 +25,12 @@ github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6f
 github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
 github.com/nicklaw5/helix v1.25.0 h1:Mrz537izZVsGdM3I46uGAAlslj61frgkhS/9xQqyT/M=
 github.com/nicklaw5/helix v1.25.0/go.mod h1:yvXZFapT6afIoxnAvlWiJiUMsYnoHl7tNs+t0bloAMw=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
+github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
 github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
 github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
 github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
@@ -44,7 +59,10 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220712014510-0a85c31ab51e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
+golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -60,3 +78,5 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

+ 10 - 2
main.go

@@ -1,6 +1,7 @@
 package main
 
 import (
+	"fmt"
 	"log"
 	"os"
 	"time"
@@ -28,7 +29,10 @@ func main() {
 	if err != nil {
 		log.Fatal("Error loading .env file")
 	}
+	// MakeNewToken()
+	// os.Exit(1)
 
+	fmt.Println("MONGO CONNECTING:", os.Getenv("DB"))
 	err = mongowrapper.Connect(os.Getenv("DB"))
 	if err != nil {
 		log.Fatal(err)
@@ -41,13 +45,17 @@ func main() {
 	InitCommands()
 	InitMP3Map()
 
-	RenewTokens()
+	err = RenewTokens()
+	if err != nil {
+		fmt.Println(err)
+		os.Exit(1)
+	}
 	CreateAPIClient()
 
 	GetGlobalEmotes()
 	TWITCH_CLIENT.GetAllChannelEmotes()
 
-	go RenewTokensLoop()
+	// go RenewTokensLoop()
 
 	go TWITCH_CLIENT.Connect()
 

+ 1 - 1
mongowrapper/mongowrapper.go

@@ -27,7 +27,7 @@ func InitCollections() {
 func Connect(uri string) (err error) {
 	var maxSize uint64 = 200
 	var minSize uint64 = 20
-	var minHeartbeat = time.Duration(1 * time.Second)
+	minHeartbeat := time.Duration(1 * time.Second)
 	opt := options.Client()
 	opt.MaxPoolSize = &maxSize
 	opt.MinPoolSize = &minSize

BIN
twitch-bot.exe


+ 24 - 3
twitch-client.go

@@ -15,6 +15,9 @@ import (
 	"time"
 
 	tirc "github.com/gempir/go-twitch-irc/v4"
+	"github.com/gopxl/beep"
+	"github.com/gopxl/beep/mp3"
+	"github.com/gopxl/beep/speaker"
 	"github.com/nicklaw5/helix"
 )
 
@@ -269,11 +272,29 @@ func RandQuote(msg *tirc.PrivateMessage) {
 }
 
 func PlaySound(tag string) {
-	cmd := exec.Command("ffplay", "-v", "0", "-nodisp", "-autoexit", "./mp3/"+tag+".mp3")
-	out, err := cmd.CombinedOutput()
+	// cmd := exec.Command("ffplay", "-v", "0", "-nodisp", "-autoexit", "./mp3/"+tag+".mp3")
+	// out, err := cmd.CombinedOutput()
+	// if err != nil {
+	// 	log.Println(err, string(out))
+	// }
+	f, err := os.Open("./mp3/" + tag + ".mp3")
 	if err != nil {
-		log.Println(err, string(out))
+		log.Fatal(err)
+	}
+
+	streamer, format, err := mp3.Decode(f)
+	if err != nil {
+		log.Fatal(err)
 	}
+	defer streamer.Close()
+
+	speaker.Init(format.SampleRate, format.SampleRate.N(time.Second/10))
+	done := make(chan bool)
+	speaker.Play(beep.Seq(streamer, beep.Callback(func() {
+		done <- true
+	})))
+
+	<-done
 }
 
 func Top10Command() {

+ 38 - 7
twitch-core.go

@@ -2,6 +2,7 @@ package main
 
 import (
 	"bufio"
+	"fmt"
 	"io"
 	"log"
 	"os"
@@ -39,11 +40,11 @@ func RenewTokensLoop() {
 	}
 }
 
-func RenewTokens() {
+func RenewTokens() error {
 	file, err := os.Open("XR")
 	if err != nil {
 		log.Println(err)
-		return
+		return err
 	}
 	defer file.Close()
 
@@ -52,7 +53,7 @@ func RenewTokens() {
 	refreshtoken := scanner.Text()
 	if err := scanner.Err(); err != nil {
 		log.Println(err)
-		return
+		return err
 	}
 
 	client, err := helix.NewClient(&helix.Options{
@@ -62,21 +63,27 @@ func RenewTokens() {
 	if err != nil {
 		log.Println("ERROR MAKIGN NEW HELIX CLIENT")
 		log.Println(err)
-		return
+		return err
 	}
 	resp, err := client.RefreshUserAccessToken(refreshtoken)
 	if err != nil {
 		log.Println("ERROR REFRESHING CREDENTIALS")
 		log.Println(err)
-		return
+		return err
 	}
 	os.Remove("X")
 	keyFile, err := os.Create("X")
 	if err != nil {
 		log.Println(err)
-		return
+		return err
+	}
+	fmt.Println("RESP:", resp.Data.AccessToken)
+	if resp.Data.AccessToken == "" {
+		os.Setenv("TWITCH_KEY", "oauth:"+refreshtoken)
+		return nil
 	}
 	keyFile.WriteString(resp.Data.AccessToken)
+	fmt.Println("TOKEN: ", "oauth:"+resp.Data.AccessToken)
 	os.Setenv("TWITCH_KEY", "oauth:"+resp.Data.AccessToken)
 	keyFile.Close()
 
@@ -84,8 +91,32 @@ func RenewTokens() {
 	refreshFile, err := os.Create("XR")
 	if err != nil {
 		log.Println(err)
-		return
+		return err
 	}
 	refreshFile.WriteString(resp.Data.RefreshToken)
 	refreshFile.Close()
+	return nil
+}
+
+func MakeNewToken() {
+	client, err := helix.NewClient(&helix.Options{
+		ClientID:     os.Getenv("CLIENT_ID"),
+		ClientSecret: os.Getenv("CLIENT_SECRET"),
+		RedirectURI:  "http://localhost:3000",
+	})
+	if err != nil {
+		log.Println("ERROR MAKIGN NEW HELIX CLIENT")
+		log.Println(err)
+		return
+	}
+	// token := client.GetUserAccessToken()
+	urlP := new(helix.AuthorizationURLParams)
+	urlP.Scopes = append(urlP.Scopes, "channel:bot", "chat:edit", "chat:read", "user:bot", "user:read:chat", "user:write:chat", "whispers:read", "whispers:edit")
+	urlP.ResponseType = "token"
+	authUrl := client.GetAuthorizationURL(urlP)
+	fmt.Println(authUrl)
+	// resp, err := client.RequestUserAccessToken("ABCDDD")
+	// fmt.Println(err)
+	// fmt.Println(resp)
+	// fmt.Println(resp.Data.AccessToken)
 }

+ 1 - 1
variables.go

@@ -45,7 +45,7 @@ func InitTwitchClient() {
 }
 
 func InitCommands() {
-	TextCommands["!monero"] = "43V6N2BpjvMYUthyqLioafZ2MQQviWEhvVTpp3hHc6LB48WYE8SsjrJKyyYzR3AYu2HkSXu8xsJhr7wdLsgSc8mGDDTkCrn"
+	// TextCommands["!monero"] = "43V6N2BpjvMYUthyqLioafZ2MQQviWEhvVTpp3hHc6LB48WYE8SsjrJKyyYzR3AYu2HkSXu8xsJhr7wdLsgSc8mGDDTkCrn"
 	TextCommands["!nvim"] = "https://github.com/zveinn/nvim-config"
 	TextCommands["!twitter"] = "https://twitter.com/keyb1nd"
 	TextCommands["!github"] = "https://github.com/zveinn"