feat: add twitch graphql streamer resolution
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
// operations.go defines the minimal Twitch GraphQL operations used by the app.
|
||||
// It builds either persisted-query or inline query requests for viewer identity
|
||||
// and streamer login resolution without exposing raw payload assembly to callers.
|
||||
package gql
|
||||
|
||||
// persistedQuery stores the persisted-query metadata Twitch expects.
|
||||
type persistedQuery struct {
|
||||
Version int `json:"version"`
|
||||
SHA256Hash string `json:"sha256Hash"`
|
||||
}
|
||||
|
||||
// extensions holds the GraphQL extensions block for one request.
|
||||
type extensions struct {
|
||||
PersistedQuery *persistedQuery `json:"persistedQuery,omitempty"`
|
||||
}
|
||||
|
||||
// Request is one Twitch GraphQL operation.
|
||||
type Request struct {
|
||||
OperationName string `json:"operationName,omitempty"`
|
||||
Query string `json:"query,omitempty"`
|
||||
Variables map[string]any `json:"variables,omitempty"`
|
||||
Extensions extensions `json:"extensions,omitempty"`
|
||||
}
|
||||
|
||||
// operation builds a persisted-query request with the supplied variables.
|
||||
func operation(name, hash string, variables map[string]any) Request {
|
||||
return Request{
|
||||
OperationName: name,
|
||||
Variables: variables,
|
||||
Extensions: extensions{
|
||||
PersistedQuery: &persistedQuery{
|
||||
Version: 1,
|
||||
SHA256Hash: hash,
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// queryOperation builds an inline-query request with the supplied variables.
|
||||
func queryOperation(name, query string, variables map[string]any) Request {
|
||||
return Request{
|
||||
OperationName: name,
|
||||
Query: query,
|
||||
Variables: variables,
|
||||
}
|
||||
}
|
||||
|
||||
// operationLabel returns a readable operation name for logs and errors.
|
||||
func (r Request) operationLabel() string {
|
||||
if r.OperationName != "" {
|
||||
return r.OperationName
|
||||
}
|
||||
if r.Query != "" {
|
||||
return "anonymous"
|
||||
}
|
||||
return "unknown"
|
||||
}
|
||||
|
||||
// CurrentUser fetches the canonical identity for the authenticated viewer.
|
||||
func CurrentUser() Request {
|
||||
return queryOperation("CurrentUser", "query CurrentUser { currentUser { id login } }", nil)
|
||||
}
|
||||
|
||||
// GetIDFromLogin resolves one login into a Twitch user record using Twitch's persisted-query hash.
|
||||
func GetIDFromLogin(login string) Request {
|
||||
return operation("GetIDFromLogin", "94e82a7b1e3c21e186daa73ee2afc4b8f23bade1fbbff6fe8ac133f50a2f58ca", map[string]any{
|
||||
"login": login,
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user