This commit is contained in:
Fijxu 2024-05-18 02:40:40 -04:00
parent 1c507cf7d6
commit 7bd38e0a24
Signed by: Fijxu
GPG key ID: 32C1DDF333EDA6A4
5 changed files with 261 additions and 87 deletions

View file

@ -1,51 +1,99 @@
require "json"
require "../twitchapi/*"
# def fetchGQL(id : String) : JSON::Any
# GqlAPI.query(id)
# end
# def fetchGQLchannel(id : String) : JSON::Any
# GqlAPI.channel(id)
# end
# def fetchGQLbanned(id : String) : JSON::Any
# GqlAPI.isBanned(id)
# end
module Users
def self.checkBanned(gql)
puts "tst2"
pp gql["userResultByLogin"]
pp gql["userResultByID"]
if gql["userResultByLogin"].nil?
return nil
elsif gql["userResultByID"].nil?
return nil
else
return true
end
end
def self.parseData(params)
helixUsers = JSON.parse(HelixAPI.users(params))
login = helixUsers["data"][0]["login"]
id = helixUsers["data"][0]["id"]
# helixUsers = JSON.parse(HelixAPI.users(params))
# begin
# login = helixUsers["data"][0]["login"]
# id = helixUsers["data"][0]["id"]
# rescue
# login = nil
# id = nil
# end
gqlUser = GqlAPI.user(id.to_s)
gqlChannel = GqlAPI.channel(id.to_s)
# helixChatColor = JSON.parse(HelixAPI.chatColor(id))
# if login.nil? && params.has_key?("login")
# login = params["login"]
# elsif id.nil? && params.has_key?("id")
# id = params["id"]
# end
panels = gqlUser["panels"]
# gqlUser = GqlAPI.user(id.to_s)
# gqlChannel = GqlAPI.channel(id.to_s)
# a = Channel(JSON::Any).new
# spawn do
# a.send fetchGQL(id.to_s)
# end
gql = GqlAPI.query(params)
panels = gql["user"]["panels"]
banned = checkBanned(gql)
pp gql
json_data = [
{
"banned" => false,
"displayName" => helixUsers["data"][0]["display_name"],
"login" => helixUsers["data"][0]["login"],
"id" => helixUsers["data"][0]["id"],
"bio" => helixUsers["data"][0]["description"],
"follows" => nil,
"followers" => gqlUser["followers"]["totalCount"],
# "banned" => banned, # TODO: FIX BANNED
"displayName" => gql["user"]["displayName"],
"login" => gql["user"]["login"],
"id" => gql["user"]["id"],
"bio" => gql["user"]["description"],
"follows" => nil,
"followers" => gql["user"]["followers"]["totalCount"],
"profileViewCount" => nil, # Always null
"panelCount" => panels.size,
# "chatColor" => helixChatColor["data"][0]["color"],
"logo" => gqlUser["profileImageURL"],
"banner" => gqlUser["bannerImageURL"],
"chatColor" => gql["user"]["chatColor"],
"logo" => gql["user"]["profileImageURL"],
"banner" => gql["user"]["bannerImageURL"],
"verifiedBot" => nil, # Deprecated by twitch
"createdAt" => gqlUser["createdAt"],
"updatedAt" => gqlUser["updatedAt"],
"deletedAt" => gqlUser["deletedAt"],
"emotePrefix" => "lol",
"createdAt" => gql["user"]["createdAt"],
"updatedAt" => gql["user"]["updatedAt"],
"deletedAt" => gql["user"]["deletedAt"],
"emotePrefix" => gql["user"]["emoticonPrefix"]["name"],
"roles" => {
"isAffiliate" => gqlUser["roles"]["isAffiliate"],
"isPartner" => gqlUser["roles"]["isPartner"],
"isStaff" => gqlUser["roles"]["isStaff"],
"isAffiliate" => gql["user"]["roles"]["isAffiliate"],
"isPartner" => gql["user"]["roles"]["isPartner"],
"isStaff" => gql["user"]["roles"]["isStaff"],
},
"badges" => gqlUser["displayBadges"],
"chatterCount" => gqlChannel["chatters"]["count"],
"chatSettings" => gqlUser["chatSettings"],
"stream" => gqlUser["stream"],
"lastBroadcast" => gqlUser["lastBroadcast"],
"panels" => panels,
"badges" => gql["user"]["displayBadges"],
"chatterCount" => gql["user"]["channel"]["chatters"]["count"],
"chatSettings" => gql["user"]["chatSettings"],
"stream" => gql["user"]["stream"],
"lastBroadcast" => gql["user"]["lastBroadcast"],
"panels" => panels,
},
]
# if json_data[0]["banned"].nil?
# puts "test"
# json_data[0]["reason"] = gql["userResultByID"]["reason"]
# end
return json_data.to_json
end
end

View file

@ -3,8 +3,10 @@ require "yaml"
class Config
include YAML::Serializable
property oauthToken : String?
property clientID : String?
property helixOAuth : String?
property helixClientID : String?
property gqlOAuth : String?
property gqlClientID : String?
property apiEndpoint : String?
property gqlEndpoint : String?
@ -13,13 +15,13 @@ class Config
config_yaml = File.read(config_file)
config = Config.from_yaml(config_yaml)
if config.oauthToken.to_s.empty?
puts "Config: 'oauthToken' is required/can't be empty"
if config.helixOAuth.to_s.empty?
puts "Config: 'helixOAuth' is required/can't be empty"
exit(1)
end
if config.clientID.to_s.empty?
puts "Config: 'oauthToken' is required/can't be empty"
if config.helixClientID.to_s.empty?
puts "Config: 'helixOAuth' is required/can't be empty"
exit(1)
end

View file

@ -7,8 +7,8 @@ require "./api/*"
require "./twitchapi/*"
CONFIG = Config.load
# puts("oauthToken: #{CONFIG.oauthToken}")
# puts("clientID: #{CONFIG.clientID}")
# puts("helixOAuth: #{CONFIG.helixOAuth}")
# puts("helixClientID: #{CONFIG.helixClientID}")
before_all "/twitch/*" do |env|
env.response.content_type = "application/json"

View file

@ -2,48 +2,172 @@ require "json"
require "uri"
module GqlAPI
@@headers = HTTP::Headers{
"Content-Type" => "application/json",
# "Client-Id" => "kimne78kx3ncx6brgo4mv6wki5h1ko", # Can cause problems due to Client-Integrity
"Authorization" => "OAuth #{CONFIG.gqlOAuth}",
"Client-Id" => "#{CONFIG.gqlClientID}",
}
@@headers = HTTP::Headers{
"Content-Type" => "application/json",
# "Client-Id" => "kimne78kx3ncx6brgo4mv6wki5h1ko", # Can cause problems due to Client-Integrity
"Client-Id" => "ue6666qo983tsx6so1t0vnawi233wa",
}
def self.userResultBy (params)
if params.has_key?("id")
return %(userResultByID(id: "#{params["id"]}"))
else
return %(userResultByLogin(login: "#{params["login"]}"))
end
end
def self.user(id : String)
data = { "query" => "{user(id:#{id}){
bannerImageURL,
profileImageURL(width: 600),
createdAt,
updatedAt,
deletedAt,
panels(hideExtensions: false){id,type},
follows(first: 1, after: buh, filter: ALL order: ASC){totalCount},
followers(first: 1, after: buh, order: ASC){totalCount},
roles{isStaff,isAffiliate,isPartner,isExtensionsDeveloper},
displayBadges(){setID, title, description,version},
chatSettings{blockLinks,chatDelayMs,slowModeDurationSeconds,followersOnlyDurationMinutes,isBroadcasterLanguageModeEnabled,isEmoteOnlyModeEnabled,isFastSubsModeEnabled,isSubscribersOnlyModeEnabled,isUniqueChatModeEnabled,requireVerifiedAccount,rules},
stream{averageFPS,bitrate,codec,createdAt,width,height,id,viewersCount,type,game{displayName}},
lastBroadcast{game{displayName},id,startedAt,title}
}}" }
return JSON.parse(gqlReq(id, data.to_json))["data"]["user"]
# def self.channel (params)
# if params.has_key?("id")
# return %(channel(id: "#{params["id"]}"))
# else
# return %(channel(name: "#{params["login"]}"))
# end
# end
def self.user (params)
if params.has_key?("id")
return %(user(id: "#{params["id"]}" lookupType: ALL))
else
return %(user(login: "#{params["login"]}" lookupType: ALL))
end
end
def self.query(params)
puts params
# id = params["id"]
# data = { "query" => "{user(id:#{id}){
# bannerImageURL,
# profileImageURL(width: 600),
# createdAt,
# updatedAt,
# deletedAt,
# chatColor,
# emoticonPrefix{name},
# panels(hideExtensions: false){id,type},
# follows(first: 1, after: buh, filter: ALL order: ASC){totalCount},
# followers(first: 1, after: buh, order: ASC){totalCount},
# roles{isStaff,isAffiliate,isPartner,isExtensionsDeveloper},
# displayBadges(){setID, title, description,version},
# chatSettings{blockLinks,chatDelayMs,slowModeDurationSeconds,followersOnlyDurationMinutes,isBroadcasterLanguageModeEnabled,isEmoteOnlyModeEnabled,isFastSubsModeEnabled,isSubscribersOnlyModeEnabled,isUniqueChatModeEnabled,requireVerifiedAccount,rules},
# stream{averageFPS,bitrate,codec,createdAt,width,height,id,viewersCount,type,game{displayName}},
# lastBroadcast{game{displayName},id,startedAt,title}
# }}" }
query = %(
query {
#{userResultBy(params)} {
... on UserDoesNotExist {
key
reason
}
}
#{user(params)} {
id
language
login
displayName
description
bannerImageURL
profileImageURL(width: 600)
createdAt
updatedAt
deletedAt
chatColor
emoticonPrefix {
name
}
panels(hideExtensions: false) {
id
type
}
followers {
totalCount
}
roles {
isStaff
isAffiliate
isPartner
isExtensionsDeveloper
}
displayBadges {
setID
title
description
version
}
chatSettings {
autoModLevel
blockLinks
chatDelayMs
followersOnlyDurationMinutes
isBroadcasterLanguageModeEnabled
isEmoteOnlyModeEnabled
isFastSubsModeEnabled
isOptedOutOfGlobalBannedWordsList
isSubscribersOnlyModeEnabled
isUniqueChatModeEnabled
requireVerifiedAccount
rules
slowModeDurationSeconds
}
stream {
averageFPS
bitrate
codec
createdAt
width
height
id
viewersCount
type
game{displayName}
}
lastBroadcast {
game{displayName}
id
startedAt
title
}
channel {
chatters {
count
moderators {
login
}
vips {
login
}
}
}
}
}
)
return JSON.parse(gqlReq(params, query))["data"]
end
def self.channel(id : String)
data = { "query" => "{channel(id:#{id}){
chatters{count,moderators{login},vips{login}}
}}" }
return JSON.parse(gqlReq(id, data.to_json))["data"]["channel"]
end
# def self.isBanned(id : String)
# data = {"query" => "{userResultByID(id:#{id}){... on UserDoesNotExist{reason}}}"}
# return JSON.parse(gqlReq(id, data.to_json))["data"]["userResultByID"]
# end
def self.query(id : String)
data = { "query" => "{query(id:#{id}){
chatters{count,moderators{login},vips{login}}
}}" }
return JSON.parse(gqlReq(id, data.to_json))["data"]["channel"]
end
# def self.channel(id : String)
# data = {"query" => "{channel(id:#{id}){
# chatters{count,moderators{login},vips{login}}
# }}"}
# return JSON.parse(gqlReq(id, data.to_json))["data"]["channel"]
# end
def self.gqlReq(id : String, data : String)
response = HTTP::Client.post(CONFIG.gqlEndpoint.to_s, headers: @@headers, body: data)
# def self.query(id : String)
# data = { "query" => "{query(id:#{id}){
# chatters{count,moderators{login},vips{login}}
# }}" }
# return JSON.parse(gqlReq(id, data.to_json))["data"]["channel"]
# end
def self.gqlReq(params, query)
data = {"query" => query}
response = HTTP::Client.post(CONFIG.gqlEndpoint.to_s, headers: @@headers, body: data.to_json)
if response.success?
return (response.body)
@ -54,7 +178,7 @@ module GqlAPI
# def self.gqlReq(operation : String, login : String)
# gqlRequest = gqlOperation2()
# puts gqlRequest
# puts gqlRequest
# response = HTTP::Client.post(CONFIG.gqlEndpoint.to_s, headers: @@headers, body: gqlRequest)
@ -65,4 +189,3 @@ module GqlAPI
# end
# end
end

View file

@ -1,8 +1,8 @@
module HelixAPI
@@headers = HTTP::Headers{
"Content-Type" => "application/json",
"Authorization" => "Bearer #{CONFIG.oauthToken}",
"Client-Id" => "#{CONFIG.clientID}",
"Authorization" => "Bearer #{CONFIG.helixOAuth}",
"Client-Id" => "#{CONFIG.helixClientID}",
}
def self.users(params)
@ -14,6 +14,7 @@ module HelixAPI
response = HTTP::Client.get(endpoint, headers: @@headers)
puts response.body
if response.success?
return (response.body)
else
@ -21,15 +22,15 @@ module HelixAPI
end
end
def self.chatColor(id)
endpoint = "#{CONFIG.apiEndpoint}/chat/color?user_id=#{id}"
# def self.chatColor(id)
# endpoint = "#{CONFIG.apiEndpoint}/chat/color?user_id=#{id}"
response = HTTP::Client.get(endpoint, headers: @@headers)
# response = HTTP::Client.get(endpoint, headers: @@headers)
if response.success?
return (response.body)
else
raise "Helix Twitch API returned #{response.status_code}: #{response.body.to_s}"
end
end
# if response.success?
# return (response.body)
# else
# raise "Helix Twitch API returned #{response.status_code}: #{response.body.to_s}"
# end
# end
end