Lookup player counts from PCGamingWiki for multiplayer modes
parent
11f75b02f7
commit
c4ce8e14aa
|
@ -0,0 +1,16 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netstandard2.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="HtmlAgilityPack" Version="1.11.46" />
|
||||
<PackageReference Include="System.Text.Json" Version="5.0.1" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\LANCommander.SDK\LANCommander.SDK.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
|
@ -0,0 +1,91 @@
|
|||
using HtmlAgilityPack;
|
||||
using LANCommander.SDK;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Net.Http;
|
||||
using System.Text.Json;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
using System.Web;
|
||||
|
||||
namespace LANCommander.PCGamingWiki
|
||||
{
|
||||
public class PCGamingWikiClient
|
||||
{
|
||||
private HttpClient Client;
|
||||
|
||||
public PCGamingWikiClient()
|
||||
{
|
||||
Client = new HttpClient();
|
||||
Client.BaseAddress = new Uri("https://www.pcgamingwiki.com/");
|
||||
}
|
||||
|
||||
public async Task<Uri> Search(string keyword)
|
||||
{
|
||||
var results = await Client.GetStringAsync($"w/api.php?action=opensearch&format=json&formatversion=2&search={HttpUtility.UrlEncode(keyword)}&limit=1");
|
||||
|
||||
string pattern = @"(https:\/\/www.pcgamingwiki.com.+)""";
|
||||
RegexOptions options = RegexOptions.Multiline;
|
||||
|
||||
var match = Regex.Match(results, pattern, options);
|
||||
|
||||
if (match.Success && match.Groups.Count == 2)
|
||||
{
|
||||
return new Uri(match.Groups[1].Value);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public async Task<Dictionary<string, int>> GetMultiplayerPlayerCounts(string keyword)
|
||||
{
|
||||
var url = await Search(keyword);
|
||||
|
||||
return await GetMultiplayerPlayerCounts(url);
|
||||
}
|
||||
|
||||
public async Task<Dictionary<string, int>> GetMultiplayerPlayerCounts(Uri url)
|
||||
{
|
||||
var results = new Dictionary<string, int>();
|
||||
|
||||
HtmlWeb web = new HtmlWeb();
|
||||
HtmlDocument dom = web.Load(url);
|
||||
|
||||
HtmlNode multiplayerTable = dom.GetElementbyId("table-network-multiplayer");
|
||||
|
||||
if (multiplayerTable == null)
|
||||
return null;
|
||||
|
||||
var multiplayerAbbrs = multiplayerTable.SelectNodes(".//abbr");
|
||||
var multiplayerCounts = multiplayerTable.SelectNodes(".//td[contains(@class, 'table-network-multiplayer-body-players')]");
|
||||
|
||||
for (int i = 0; i < multiplayerAbbrs.Count; i++)
|
||||
{
|
||||
var type = multiplayerAbbrs[i].InnerText;
|
||||
var players = multiplayerCounts[i].InnerText;
|
||||
|
||||
int playerCount = 0;
|
||||
|
||||
if (Int32.TryParse(players, out playerCount))
|
||||
{
|
||||
switch (type.ToLower())
|
||||
{
|
||||
case "local play":
|
||||
results["Local Play"] = playerCount;
|
||||
break;
|
||||
|
||||
case "lan play":
|
||||
results["LAN Play"] = playerCount;
|
||||
break;
|
||||
|
||||
case "online play":
|
||||
results["Online Play"] = playerCount;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -9,6 +9,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LANCommander.PlaynitePlugin
|
|||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LANCommander.SDK", "LANCommander.SDK\LANCommander.SDK.csproj", "{4C2A71FD-A30B-4D62-888A-4EF843D8E506}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LANCommander.PCGamingWiki", "LANCommander.PCGamingWiki\LANCommander.PCGamingWiki.csproj", "{2436B817-4475-4E70-9BB2-E1E7866DB79F}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
|
@ -27,6 +29,10 @@ Global
|
|||
{4C2A71FD-A30B-4D62-888A-4EF843D8E506}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{4C2A71FD-A30B-4D62-888A-4EF843D8E506}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{4C2A71FD-A30B-4D62-888A-4EF843D8E506}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{2436B817-4475-4E70-9BB2-E1E7866DB79F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{2436B817-4475-4E70-9BB2-E1E7866DB79F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{2436B817-4475-4E70-9BB2-E1E7866DB79F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{2436B817-4475-4E70-9BB2-E1E7866DB79F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
|
|
@ -13,6 +13,7 @@ using LANCommander.Services;
|
|||
using System.Drawing;
|
||||
using LANCommander.Models;
|
||||
using LANCommander.Data.Enums;
|
||||
using LANCommander.PCGamingWiki;
|
||||
|
||||
namespace LANCommander.Controllers
|
||||
{
|
||||
|
@ -26,6 +27,7 @@ namespace LANCommander.Controllers
|
|||
private readonly GenreService GenreService;
|
||||
private readonly CompanyService CompanyService;
|
||||
private readonly IGDBService IGDBService;
|
||||
private readonly PCGamingWikiClient PCGamingWikiClient;
|
||||
|
||||
public GamesController(GameService gameService, ArchiveService archiveService, CategoryService categoryService, TagService tagService, GenreService genreService, CompanyService companyService, IGDBService igdbService)
|
||||
{
|
||||
|
@ -36,6 +38,7 @@ namespace LANCommander.Controllers
|
|||
GenreService = genreService;
|
||||
CompanyService = companyService;
|
||||
IGDBService = igdbService;
|
||||
PCGamingWikiClient = new PCGamingWikiClient();
|
||||
}
|
||||
|
||||
// GET: Games
|
||||
|
@ -57,7 +60,12 @@ namespace LANCommander.Controllers
|
|||
|
||||
if (igdbid == null)
|
||||
{
|
||||
viewModel.Game = new Game();
|
||||
viewModel.Game = new Game()
|
||||
{
|
||||
Actions = new List<Data.Models.Action>(),
|
||||
MultiplayerModes = new List<Data.Models.MultiplayerMode>()
|
||||
};
|
||||
|
||||
viewModel.Developers = CompanyService.Get().OrderBy(c => c.Name).Select(c => new SelectListItem() { Text = c.Name, Value = c.Name }).ToList();
|
||||
viewModel.Publishers = CompanyService.Get().OrderBy(c => c.Name).Select(c => new SelectListItem() { Text = c.Name, Value = c.Name }).ToList();
|
||||
viewModel.Genres = GenreService.Get().OrderBy(g => g.Name).Select(g => new SelectListItem() { Text = g.Name, Value = g.Name }).ToList();
|
||||
|
@ -74,9 +82,42 @@ namespace LANCommander.Controllers
|
|||
Title = result.Name,
|
||||
Description = result.Summary,
|
||||
ReleasedOn = result.FirstReleaseDate.GetValueOrDefault().UtcDateTime,
|
||||
MultiplayerModes = new List<MultiplayerMode>(),
|
||||
Actions = new List<Data.Models.Action>(),
|
||||
MultiplayerModes = new List<MultiplayerMode>()
|
||||
};
|
||||
|
||||
var playerCounts = await PCGamingWikiClient.GetMultiplayerPlayerCounts(result.Name);
|
||||
|
||||
foreach (var playerCount in playerCounts)
|
||||
{
|
||||
MultiplayerType type;
|
||||
|
||||
switch (playerCount.Key)
|
||||
{
|
||||
case "Local Play":
|
||||
type = MultiplayerType.Local;
|
||||
break;
|
||||
|
||||
case "LAN Play":
|
||||
type = MultiplayerType.Lan;
|
||||
break;
|
||||
|
||||
case "Online Play":
|
||||
type = MultiplayerType.Online;
|
||||
break;
|
||||
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
|
||||
viewModel.Game.MultiplayerModes.Add(new MultiplayerMode()
|
||||
{
|
||||
Type = type,
|
||||
MaxPlayers = playerCount.Value,
|
||||
MinPlayers = 2
|
||||
});
|
||||
}
|
||||
|
||||
if (result.GameModes != null && result.GameModes.Values != null)
|
||||
viewModel.Game.Singleplayer = result.GameModes.Values.Any(gm => gm.Name == "Singleplayer");
|
||||
|
||||
|
|
|
@ -49,6 +49,7 @@
|
|||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\LANCommander.PCGamingWiki\LANCommander.PCGamingWiki.csproj" />
|
||||
<ProjectReference Include="..\LANCommander.SDK\LANCommander.SDK.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
@model LANCommander.Models.GameViewModel
|
||||
@using LANCommander.Components
|
||||
@model LANCommander.Models.GameViewModel
|
||||
|
||||
@{
|
||||
ViewData["Title"] = "Add Game";
|
||||
|
@ -83,6 +84,18 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-header">
|
||||
<h3 class="card-title">Actions</h3>
|
||||
</div>
|
||||
|
||||
<component type="typeof(ActionEditor)" render-mode="Server" param-Actions="Model.Game.Actions" param-GameId="Model.Game.Id" />
|
||||
|
||||
<div class="card-header">
|
||||
<h3 class="card-title">Multiplayer Modes</h3>
|
||||
</div>
|
||||
|
||||
<component type="typeof(MultiplayerModeEditor)" render-mode="Server" param-MultiplayerModes="Model.Game.MultiplayerModes" param-GameId="Model.Game.Id" />
|
||||
|
||||
<div class="card-footer">
|
||||
<div class="d-flex">
|
||||
<a asp-action="Index" class="btn btn-ghost-primary">Cancel</a>
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
using System;
|
||||
|
||||
namespace PCGamingWikiClient
|
||||
{
|
||||
private HttpClient Client;
|
||||
|
||||
public PCGamingWikiService()
|
||||
{
|
||||
Client = new HttpClient();
|
||||
Client.BaseAddress = new Uri("https://www.pcgamingwiki.com/");
|
||||
}
|
||||
|
||||
public SearchResult Search(string keyword)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netstandard2.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
Loading…
Reference in New Issue