1+ using Newtonsoft . Json . Linq ;
2+ using System . Net . Http . Headers ;
3+
4+ class Streamer
5+ {
6+ public string ? Id { get ; set ; }
7+ public string ? Login { get ; set ; }
8+ public string ? DisplayName { get ; set ; }
9+ public DateTime CreatedAt { get ; set ; }
10+ public int Followers { get ; set ; }
11+ }
12+ class Twitch
13+ {
14+ private string ? _clientId ;
15+ private string ? _clientSecret ;
16+ private HttpClient _httpClient = new HttpClient ( ) ;
17+
18+ public Twitch ( )
19+ {
20+ _clientId = Environment . GetEnvironmentVariable ( "CLIENT_ID" ) ;
21+ _clientSecret = Environment . GetEnvironmentVariable ( "CLIENT_SECRET" ) ;
22+ _httpClient . DefaultRequestHeaders . Add ( "client-id" , _clientId ) ;
23+ }
24+
25+ public async Task < bool > GetToken ( )
26+ {
27+ if ( string . IsNullOrWhiteSpace ( _clientId ) || string . IsNullOrEmpty ( _clientSecret ) )
28+ {
29+ Console . WriteLine ( "No se cuenta con las credenciales necesarias..." ) ;
30+ return false ;
31+ }
32+ string url = "https://id.twitch.tv/oauth2/token" ;
33+
34+ var content = new Dictionary < string , string >
35+ {
36+ { "grant_type" , "client_credentials" } ,
37+ { "client_id" , _clientId } ,
38+ { "client_secret" , _clientSecret }
39+ } ;
40+
41+
42+ var response = await _httpClient . PostAsync ( url , new FormUrlEncodedContent ( content ) ) ;
43+ if ( response . StatusCode != System . Net . HttpStatusCode . OK )
44+ return false ;
45+
46+ var jsonResponse = await response . Content . ReadAsStringAsync ( ) ;
47+ string token = JObject . Parse ( jsonResponse ) [ "access_token" ] . ToString ( ) ;
48+
49+ _httpClient . DefaultRequestHeaders . Authorization = new AuthenticationHeaderValue ( "Bearer" , token ) ;
50+
51+ return true ;
52+ }
53+
54+ public async Task < Streamer ? > GetUserInfo ( string user )
55+ {
56+ string url = $ "https://api.twitch.tv/helix/users?login={ user } ";
57+
58+ var response = await _httpClient . GetAsync ( url ) ;
59+ if ( response . StatusCode != System . Net . HttpStatusCode . OK )
60+ return null ;
61+
62+ var jsonResponse = await response . Content . ReadAsStringAsync ( ) ;
63+
64+ var objectResponse = JObject . Parse ( jsonResponse ) ;
65+ if ( objectResponse [ "data" ] . Count ( ) == 0 )
66+ return null ;
67+ var streamer = new Streamer ( ) ;
68+ streamer . Id = objectResponse [ "data" ] [ 0 ] [ "id" ] . ToString ( ) ;
69+ streamer . Login = objectResponse [ "data" ] [ 0 ] [ "login" ] . ToString ( ) ;
70+ streamer . DisplayName = objectResponse [ "data" ] [ 0 ] [ "display_name" ] . ToString ( ) ;
71+ streamer . CreatedAt = ( DateTime ) objectResponse [ "data" ] [ 0 ] [ "created_at" ] ;
72+
73+ return streamer ;
74+ }
75+ public async Task < int > GetFollowers ( string id )
76+ {
77+ string url = $ "https://api.twitch.tv/helix/channels/followers?broadcaster_id={ id } ";
78+
79+ var response = await _httpClient . GetAsync ( url ) ;
80+ if ( response . StatusCode != System . Net . HttpStatusCode . OK )
81+ return 0 ;
82+
83+ var jsonResponse = await response . Content . ReadAsStringAsync ( ) ;
84+
85+ var objectResponse = JObject . Parse ( jsonResponse ) ;
86+
87+ int followers = ( int ) objectResponse [ "total" ] ;
88+
89+ return followers ;
90+ }
91+ }
92+ class Program
93+ {
94+ static async Task Main ( string [ ] args )
95+ {
96+
97+ Twitch twitch = new Twitch ( ) ;
98+
99+ bool authorized = await twitch . GetToken ( ) ;
100+ if ( ! authorized )
101+ {
102+ Console . WriteLine ( "No ha sido posible obtener autorización..." ) ;
103+ return ;
104+ }
105+
106+ var users = new List < string >
107+ {
108+ "littleragergirl" , "ache" , "adricontreras4" , "agustin51" , "alexby11" , "ampeterby7" , "tvander" ,
109+ "arigameplays" , "arigeli_" , "auronplay" , "axozer" , "beniju03" , "bycalitos" ,
110+ "byviruzz" , "carreraaa" , "celopan" , "srcheeto" , "crystalmolly" , "darioemehache" ,
111+ "dheylo" , "djmariio" , "doble" , "elvisayomastercard" , "elyas360" , "folagorlives" , "thegrefg" ,
112+ "guanyar" , "hika" , "hiperop" , "ibai" , "ibelky_" , "illojuan" , "imantado" ,
113+ "irinaissaia" , "jesskiu" , "jopa" , "jordiwild" , "kenaivsouza" , "mrkeroro10" ,
114+ "thekiddkeo95" , "kikorivera" , "knekro" , "kokoop" , "kronnozomberoficial" , "leviathan" ,
115+ "litkillah" , "lolalolita" , "lolitofdez" , "luh" , "luzu" , "mangel" , "mayichi" ,
116+ "melo" , "missasinfonia" , "mixwell" , "jaggerprincesa" , "nategentile7" , "nexxuz" ,
117+ "lakshartnia" , "nilojeda" , "nissaxter" , "olliegamerz" , "orslok" , "outconsumer" , "papigavitv" ,
118+ "paracetamor" , "patica1999" , "paulagonu" , "pausenpaii" , "perxitaa" , "nosoyplex" ,
119+ "polispol1" , "quackity" , "recuerd0p" , "reventxz" , "rivers_gg" , "robertpg" , "roier" ,
120+ "ceuvebrokenheart" , "rubius" , "shadoune666" , "silithur" , "spok_sponha" , "elspreen" , "spursito" ,
121+ "bystaxx" , "suzyroxx" , "vicens" , "vitu" , "werlyb" , "xavi" , "xcry" , "elxokas" ,
122+ "thezarcort" , "zeling" , "zormanworld" , "mouredev"
123+ } ;
124+ var userDataList = new List < Streamer > ( ) ;
125+ var notFoundList = new List < string > ( ) ;
126+ foreach ( var user in users )
127+ {
128+ var streamer = await twitch . GetUserInfo ( user ) ;
129+ if ( streamer == null )
130+ notFoundList . Add ( user ) ;
131+ else
132+ {
133+ streamer . Followers = await twitch . GetFollowers ( streamer . Id ) ;
134+ userDataList . Add ( streamer ) ;
135+ }
136+ }
137+
138+ var followersSortedList = userDataList . OrderByDescending ( u => u . Followers ) . ToList ( ) ;
139+ var dateSortedList = userDataList . OrderBy ( u => u . CreatedAt ) . ToList ( ) ;
140+
141+ Console . WriteLine ( "----Ranking por número de seguidores----" ) ;
142+ foreach ( var ( user , id ) in followersSortedList . Select ( ( item , index ) => ( item , index ) ) )
143+ Console . WriteLine ( $ "{ id + 1 } { user . DisplayName } Seguidores: { user . Followers } ") ;
144+
145+ Console . WriteLine ( "----Ranking por antigüedad----" ) ;
146+ foreach ( var ( user , id ) in dateSortedList . Select ( ( item , index ) => ( item , index ) ) )
147+ Console . WriteLine ( $ "{ id + 1 } { user . DisplayName } Creado el { user . CreatedAt . ToShortDateString ( ) } ") ;
148+
149+ if ( notFoundList . Count > 0 )
150+ {
151+ Console . WriteLine ( "----Usuarios no encontrados----" ) ;
152+ foreach ( var user in notFoundList )
153+ Console . WriteLine ( user ) ;
154+ }
155+ }
156+ }
0 commit comments