Skip to content

Commit 30cdd60

Browse files
authored
Merge pull request mouredev#7364 from Hequebo/hequebo40
mouredev#40 - C#
2 parents 91b16e7 + 6c0f2b7 commit 30cdd60

File tree

1 file changed

+156
-0
lines changed

1 file changed

+156
-0
lines changed
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
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

Comments
 (0)