return &badge
}
-var modelValid = model.Application.Twitch.Valid
+var tokenState = model.Application.Twitch.TokenState
func downloadBadges() {
- if val, _ := modelValid.Get(); !val {
+ if val, _ := tokenState.Get(); val != model.Valid {
+ return
+ }
+
+ if len(badgeMap) != 0 {
return
}
func init() {
badgeMap = make(map[string]image.Image)
- modelValid.AddListener(binding.NewDataListener(downloadBadges))
+ tokenState.AddListener(binding.NewDataListener(downloadBadges))
}
"sync"
"fyne.io/fyne/v2/data/binding"
+ "go.openfl.eu/chat-scroller/model"
"go.openfl.eu/chat-scroller/token"
)
}
func downloadEmotes() {
- if val, _ := modelValid.Get(); !val {
+ if val, _ := tokenState.Get(); val != model.Valid {
+ return
+ }
+
+ if len(emoteMap) != 0 {
return
}
func init() {
emoteMap = make(map[string]image.Image)
- modelValid.AddListener(binding.NewDataListener(downloadEmotes))
+ tokenState.AddListener(binding.NewDataListener(downloadEmotes))
}
"runtime/pprof"
"fyne.io/fyne/v2/app"
+ "fyne.io/fyne/v2/data/binding"
"fyne.io/fyne/v2/theme"
+ "go.openfl.eu/chat-scroller/model"
"go.openfl.eu/chat-scroller/status"
+ "go.openfl.eu/chat-scroller/token"
// for init purposes
_ "go.openfl.eu/chat-scroller/decorations"
_ "go.openfl.eu/chat-scroller/messages"
+ _ "go.openfl.eu/chat-scroller/model"
_ "go.openfl.eu/chat-scroller/token"
)
scroller := app.New()
+ // this listener will trigger on initialization
+ model.Application.Twitch.TokenState.AddListener(binding.NewDataListener(func() { token.Authenticate(&scroller) }))
+
scroller.Settings().SetTheme(theme.LightTheme())
go status.CreateSetupWindow(scroller)
"go.openfl.eu/chat-scroller/token"
)
-var valid = model.Application.Twitch.Valid
+var state = model.Application.Twitch.TokenState
var client = twitch.NewChatClient()
core.DebugLogger = os.Stdout
}
- val, _ := valid.Get()
- if !val {
+ val, _ := state.Get()
+ if val != model.Valid {
return
}
if generate {
}
func init() {
- valid.AddListener(fynepatch.NewGoroutineDataListener(startClient))
+ state.AddListener(fynepatch.NewGoroutineDataListener(startClient))
}
}
type TwitchModel struct {
- Valid binding.Bool
- Token binding.String
+ TokenState binding.Untyped
+ Token binding.String
}
var Application Model
func init() {
{
tw := &Application.Twitch
- tw.Valid = binding.NewBool()
+ tw.TokenState = binding.NewUntyped()
+ tw.TokenState.Set(Absent)
tw.Token = binding.NewString()
}
- debug := false
+ debug := true
if debug {
- Application.Twitch.Valid.AddListener(binding.NewDataListener(func() {
- fmt.Print("token valid: ")
- fmt.Println(Application.Twitch.Valid.Get())
+ Application.Twitch.TokenState.AddListener(binding.NewDataListener(func() {
+ fmt.Print("token state: ")
+ fmt.Println(Application.Twitch.TokenState.Get())
}))
Application.Twitch.Token.AddListener(binding.NewDataListener(func() {
fmt.Print("access token: ")
"go.openfl.eu/chat-scroller/chat"
"go.openfl.eu/chat-scroller/model"
"go.openfl.eu/chat-scroller/status/twitchconn"
- "go.openfl.eu/chat-scroller/status/twitchlogin"
)
type windows struct {
var cscrWindows windows
-var valid = model.Application.Twitch.Valid
+var state = model.Application.Twitch.TokenState
// UI items
var (
}
func ableSpawnButton() {
- val, _ := valid.Get()
- if val {
+ val, _ := state.Get()
+ if val == model.Valid {
spawnButton.Enable()
} else {
spawnButton.Disable()
// init but after app is created
createSpinner()
- twitchlogin.CreateContent()
twitchconn.CreateContent()
// own creations
statusWindow.SetContent(container.NewVBox(
//spinner,
twitchconn.Content,
- twitchlogin.Content,
spawnButton,
))
statusWindow.Show()
- valid.AddListener(binding.NewDataListener(ableSpawnButton))
+ state.AddListener(binding.NewDataListener(ableSpawnButton))
}
var Content fyne.CanvasObject
-var valid = model.Application.Twitch.Valid
+var tokenState = model.Application.Twitch.TokenState
var token = model.Application.Twitch.Token
// UI elements
}
func updateLabel() {
- val, _ := valid.Get()
- if val {
+ state, _ := tokenState.Get()
+ switch state {
+ case model.Valid:
tokenLabel.Text = "access token available"
- } else {
+ case model.Invalid:
tokenLabel.Text = "access token invalid"
+ case model.Absent:
+ tokenLabel.Text = "Please log in"
}
Content.Refresh()
Content = container.NewMax(
tokenLabel,
)
- Content.Hide()
- token.AddListener(binding.NewDataListener(showContent))
- valid.AddListener(binding.NewDataListener(updateLabel))
+ //token.AddListener(binding.NewDataListener(showContent))
+ tokenState.AddListener(binding.NewDataListener(updateLabel))
}
+++ /dev/null
-package twitchlogin
-
-import (
- "net/url"
- "sync"
-
- "fyne.io/fyne/v2"
- "fyne.io/fyne/v2/container"
- "fyne.io/fyne/v2/data/binding"
- "fyne.io/fyne/v2/widget"
- "go.openfl.eu/chat-scroller/model"
- "go.openfl.eu/twitch-auth/device"
-)
-
-var Content fyne.CanvasObject
-var tokenChannel <-chan device.AuthResponse
-var readingTokens = sync.Mutex{}
-
-var valid = model.Application.Twitch.Valid
-
-func login() {
- if !readingTokens.TryLock() {
- return
- }
- defer readingTokens.Unlock()
-
- // TODO closing channel when/how?
- tokenChannel = device.Authenticate(&device.Config{
- "9mcopb33ssgli53u6cor8ou2pvyb0g",
- []string{"user:read:chat", "user:write:chat", "chat:read"},
- })
-
- app := fyne.CurrentApp()
-
- for token := range tokenChannel {
- if token.Err == nil {
- model.Application.Twitch.Token.Set(token.AccessCode)
- } else {
- valid.Set(false)
- err := token.Err
- validating, ok := err.(device.AuthorizationPendingError)
- if ok {
- u, err := url.Parse(validating.Url)
- if err != nil {
- panic(err)
- }
- err = app.OpenURL(u)
- if err != nil {
- panic(err)
- }
- }
- }
- }
-
-}
-
-func CreateContent() {
- label := widget.NewLabel("hi")
- loginButton := widget.NewButton("login to twitch", func() {
- go login()
- })
- Content = container.NewVBox(label, loginButton)
-
- valid.AddListener(binding.NewDataListener(func() {
- val, _ := valid.Get()
- if val {
- Content.Hide()
- } else {
- Content.Show()
- }
-
- Content.Refresh()
- }))
-}
-#TODO
+--TODO
-auth again?
-persistence
+better emotes showing
chat settings
-log levels
+persistence
+log levels?
// token error
if resp.StatusCode == http.StatusUnauthorized {
fmt.Println("invalid token")
- model.Application.Twitch.Valid.Set(false)
+ model.Application.Twitch.TokenState.Set(model.Invalid)
return
}
fmt.Printf("couldn't decode validation response: %s\n", err)
}
- model.Application.Twitch.Valid.Set(true)
+ model.Application.Twitch.TokenState.Set(model.Valid)
}
func init() {