Rework
This commit is contained in:
parent
90d7281050
commit
01310020ce
41
API/Api.cs
Normal file
41
API/Api.cs
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
using SQLiteEF;
|
||||||
|
|
||||||
|
namespace API;
|
||||||
|
|
||||||
|
public class Api
|
||||||
|
{
|
||||||
|
public Api(string[] args)
|
||||||
|
{
|
||||||
|
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
|
||||||
|
|
||||||
|
// Add services to the container.
|
||||||
|
|
||||||
|
builder.Services.AddControllers();
|
||||||
|
// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
|
||||||
|
builder.Services.AddOpenApi();
|
||||||
|
|
||||||
|
builder.Services.AddDbContext<Context>();
|
||||||
|
|
||||||
|
WebApplication app = builder.Build();
|
||||||
|
|
||||||
|
// Configure the HTTP request pipeline.
|
||||||
|
if (app.Environment.IsDevelopment())
|
||||||
|
{
|
||||||
|
app.MapOpenApi();
|
||||||
|
}
|
||||||
|
|
||||||
|
app.UseHttpsRedirection();
|
||||||
|
|
||||||
|
app.UseAuthorization();
|
||||||
|
|
||||||
|
|
||||||
|
app.MapControllers();
|
||||||
|
|
||||||
|
app.Run();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Main(string[] args)
|
||||||
|
{
|
||||||
|
Api _ = new (args);
|
||||||
|
}
|
||||||
|
}
|
23
API/Properties/launchSettings.json
Normal file
23
API/Properties/launchSettings.json
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://json.schemastore.org/launchsettings.json",
|
||||||
|
"profiles": {
|
||||||
|
"http": {
|
||||||
|
"commandName": "Project",
|
||||||
|
"dotnetRunMessages": true,
|
||||||
|
"launchBrowser": false,
|
||||||
|
"applicationUrl": "http://localhost:5239",
|
||||||
|
"environmentVariables": {
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"https": {
|
||||||
|
"commandName": "Project",
|
||||||
|
"dotnetRunMessages": true,
|
||||||
|
"launchBrowser": false,
|
||||||
|
"applicationUrl": "https://localhost:7103;http://localhost:5239",
|
||||||
|
"environmentVariables": {
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
8
API/appsettings.Development.json
Normal file
8
API/appsettings.Development.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"Logging": {
|
||||||
|
"LogLevel": {
|
||||||
|
"Default": "Information",
|
||||||
|
"Microsoft.AspNetCore": "Warning"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
9
API/appsettings.json
Normal file
9
API/appsettings.json
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"Logging": {
|
||||||
|
"LogLevel": {
|
||||||
|
"Default": "Information",
|
||||||
|
"Microsoft.AspNetCore": "Warning"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"AllowedHosts": "*"
|
||||||
|
}
|
12
Run/Program.cs
Normal file
12
Run/Program.cs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
using API;
|
||||||
|
|
||||||
|
namespace Run;
|
||||||
|
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
Api a = new (args);
|
||||||
|
Tracker.Tracker t = new ();
|
||||||
|
}
|
||||||
|
}
|
16
Run/Run.csproj
Normal file
16
Run/Run.csproj
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net9.0</TargetFramework>
|
||||||
|
<LangVersion>latest</LangVersion>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\API\API.csproj" />
|
||||||
|
<ProjectReference Include="..\Tracker\Tracker.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
38
SQLiteEF/Player.cs
Normal file
38
SQLiteEF/Player.cs
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
||||||
|
namespace SQLiteEF;
|
||||||
|
|
||||||
|
[PrimaryKey("SteamId")]
|
||||||
|
public class Player : IUpdateable
|
||||||
|
{
|
||||||
|
public ulong SteamId { get; init; }
|
||||||
|
public string Name { get; set; }
|
||||||
|
public string ProfileUrl { get; set; }
|
||||||
|
public string AvatarUrl { get; set; }
|
||||||
|
|
||||||
|
public ICollection<Game> Games { get; init; } = null!;
|
||||||
|
public ICollection<TrackedTime> TrackedTimes { get; init; } = null!;
|
||||||
|
public DateTime UpdatedAt { get; set; } = DateTime.Now;
|
||||||
|
|
||||||
|
public Player(ulong steamid, string name, string profileUrl, string avatarUrl)
|
||||||
|
{
|
||||||
|
this.SteamId = steamid;
|
||||||
|
this.Name = name;
|
||||||
|
this.ProfileUrl = profileUrl;
|
||||||
|
this.AvatarUrl = avatarUrl;
|
||||||
|
this.Games = [];
|
||||||
|
this.TrackedTimes = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// EF CORE
|
||||||
|
/// </summary>
|
||||||
|
internal Player(ulong steamid, string name, string profileUrl, string avatarUrl, DateTime updatedAt)
|
||||||
|
{
|
||||||
|
this.SteamId = steamid;
|
||||||
|
this.Name = name;
|
||||||
|
this.ProfileUrl = profileUrl;
|
||||||
|
this.AvatarUrl = avatarUrl;
|
||||||
|
this.UpdatedAt = updatedAt;
|
||||||
|
}
|
||||||
|
}
|
14
SQLiteEF/SQLiteEF.csproj
Normal file
14
SQLiteEF/SQLiteEF.csproj
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net9.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.5" />
|
||||||
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.5" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
155
Tracker/Tracker.cs
Normal file
155
Tracker/Tracker.cs
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
using Microsoft.Extensions.Configuration;
|
||||||
|
using SQLiteEF;
|
||||||
|
using SteamApiWrapper.ReturnTypes;
|
||||||
|
using SteamGame = SteamApiWrapper.ReturnTypes.Game;
|
||||||
|
using Player = SQLiteEF.Player;
|
||||||
|
using SteamPlayer = SteamApiWrapper.ReturnTypes.Player;
|
||||||
|
using Steam = SteamApiWrapper.SteamApiWrapper;
|
||||||
|
|
||||||
|
namespace Tracker;
|
||||||
|
|
||||||
|
public class Tracker : IDisposable
|
||||||
|
{
|
||||||
|
private IConfiguration Configuration { get; init; }
|
||||||
|
private readonly Thread _trackerThread;
|
||||||
|
private bool _running = true;
|
||||||
|
|
||||||
|
public Tracker()
|
||||||
|
{
|
||||||
|
Configuration = new ConfigurationBuilder()
|
||||||
|
.AddJsonFile("appsettings.json")
|
||||||
|
.Build();
|
||||||
|
_trackerThread = new (TrackerLoop);
|
||||||
|
_trackerThread.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdatePlayers()
|
||||||
|
{
|
||||||
|
Context context = new (Configuration);
|
||||||
|
IQueryable<ulong> players = context.Players.Select(p => p.SteamId);
|
||||||
|
GetPlayerSummaries summaries = Steam.GetPlayerSummaries(players.ToArray());
|
||||||
|
foreach (SteamPlayer summariesPlayer in summaries.players)
|
||||||
|
{
|
||||||
|
if (context.Players.Find(summariesPlayer.steamid) is not { } player)
|
||||||
|
{
|
||||||
|
context.Players.Add(new (summariesPlayer.steamid, summariesPlayer.personaname,
|
||||||
|
summariesPlayer.profileurl, summariesPlayer.avatar));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
player.Name = summariesPlayer.personaname;
|
||||||
|
player.ProfileUrl = summariesPlayer.profileurl;
|
||||||
|
player.AvatarUrl = summariesPlayer.avatar;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
context.SaveChanges();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateOwnedGames()
|
||||||
|
{
|
||||||
|
Context context = new (Configuration);
|
||||||
|
IQueryable<Player> players = context.Players;
|
||||||
|
foreach (Player player in players)
|
||||||
|
{
|
||||||
|
GetOwnedGames ownedGames = Steam.GetOwnedGames(player.SteamId);
|
||||||
|
foreach (SteamGame ownedGame in ownedGames.games)
|
||||||
|
{
|
||||||
|
if (context.Games.Find(ownedGame.appid) is not { } game)
|
||||||
|
{
|
||||||
|
game = new(ownedGame.appid, ownedGame.name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!player.Games.Contains(game))
|
||||||
|
{
|
||||||
|
player.Games.Add(game);
|
||||||
|
game.PlayedBy.Add(player);
|
||||||
|
player.TrackedTimes.Add(new (game, player, ownedGame.playtime_forever));
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
context.SaveChanges();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateGametimes()
|
||||||
|
{
|
||||||
|
Context context = new (Configuration);
|
||||||
|
IQueryable<Player> players = context.Players;
|
||||||
|
foreach (Player player in players)
|
||||||
|
{
|
||||||
|
GetRecentlyPlayedGames recentlyPlayed = Steam.GetRecentlyPlayedGames(player.SteamId);
|
||||||
|
foreach (SteamGame recentlyPlayedGame in recentlyPlayed.games)
|
||||||
|
{
|
||||||
|
if (context.Games.Find(recentlyPlayedGame.appid) is not { } game)
|
||||||
|
{
|
||||||
|
game = new(recentlyPlayedGame.appid, recentlyPlayedGame.name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!player.Games.Contains(game))
|
||||||
|
{
|
||||||
|
player.Games.Add(game);
|
||||||
|
game.PlayedBy.Add(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
player.TrackedTimes.Add(new (game, player, recentlyPlayedGame.playtime_forever));
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
context.SaveChanges();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void TrackerLoop()
|
||||||
|
{
|
||||||
|
while (_running)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Thread.Sleep(TimeSpan.FromHours(1));
|
||||||
|
}
|
||||||
|
catch (ThreadInterruptedException)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Thread interrupted");
|
||||||
|
}
|
||||||
|
catch (ThreadAbortException)
|
||||||
|
{
|
||||||
|
_running = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Console.WriteLine("Thread exited");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ForceLoop()
|
||||||
|
{
|
||||||
|
_trackerThread.Interrupt();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
Tracker _ = new ();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
_running = false;
|
||||||
|
_trackerThread.Interrupt();
|
||||||
|
}
|
||||||
|
}
|
21
Tracker/Tracker.csproj
Normal file
21
Tracker/Tracker.csproj
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net9.0</TargetFramework>
|
||||||
|
<LangVersion>latest</LangVersion>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\SQLiteEF\SQLiteEF.csproj" />
|
||||||
|
<ProjectReference Include="..\SteamApiWrapper\SteamApiWrapper.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Configuration" Version="9.0.5" />
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="9.0.5" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
Loading…
x
Reference in New Issue
Block a user