2019-03-25 22:12:16 -04:00
using Microsoft.AspNetCore.Diagnostics ;
2018-02-21 20:29:23 -05:00
using Microsoft.AspNetCore.Mvc ;
2019-12-02 16:52:36 -05:00
using SharedLibraryCore ;
2019-07-24 11:36:37 -04:00
using SharedLibraryCore.Dtos ;
2019-12-02 16:52:36 -05:00
using SharedLibraryCore.Interfaces ;
2019-07-24 11:36:37 -04:00
using System.Linq ;
using System.Threading.Tasks ;
2020-11-11 18:31:26 -05:00
using Microsoft.Extensions.Logging ;
2020-04-13 21:26:13 -04:00
using static SharedLibraryCore . Server ;
2020-11-11 18:31:26 -05:00
using ILogger = Microsoft . Extensions . Logging . ILogger ;
2018-02-21 20:29:23 -05:00
namespace WebfrontCore.Controllers
{
2018-03-06 02:22:19 -05:00
public class HomeController : BaseController
2018-02-21 20:29:23 -05:00
{
2020-05-11 17:10:43 -04:00
private readonly ITranslationLookup _translationLookup ;
2020-11-11 18:31:26 -05:00
private readonly ILogger _logger ;
2020-05-11 17:10:43 -04:00
2020-11-11 18:31:26 -05:00
public HomeController ( ILogger < HomeController > logger , IManager manager , ITranslationLookup translationLookup ) : base ( manager )
2020-01-31 21:15:07 -05:00
{
2020-11-11 18:31:26 -05:00
_logger = logger ;
2020-05-11 17:10:43 -04:00
_translationLookup = translationLookup ;
2019-12-02 16:52:36 -05:00
}
2020-04-13 21:26:13 -04:00
public async Task < IActionResult > Index ( Game ? game = null )
2018-02-21 20:29:23 -05:00
{
2018-03-13 17:30:22 -04:00
ViewBag . Description = "IW4MAdmin is a complete server administration tool for IW4x." ;
2018-05-05 18:52:04 -04:00
ViewBag . Title = Localization [ "WEBFRONT_HOME_TITLE" ] ;
2018-03-13 17:30:22 -04:00
ViewBag . Keywords = "IW4MAdmin, server, administration, IW4x, MW2, Modern Warfare 2" ;
2020-04-13 21:26:13 -04:00
var servers = Manager . GetServers ( ) . Where ( _server = > ! game . HasValue ? true : _server . GameName = = game ) ;
2019-07-24 11:36:37 -04:00
var model = new IW4MAdminInfo ( )
{
2020-04-13 21:26:13 -04:00
TotalAvailableClientSlots = servers . Sum ( _server = > _server . MaxClients ) ,
TotalOccupiedClientSlots = servers . SelectMany ( _server = > _server . GetClientsAsList ( ) ) . Count ( ) ,
2019-07-24 11:36:37 -04:00
TotalClientCount = await Manager . GetClientService ( ) . GetTotalClientsAsync ( ) ,
2020-04-13 21:26:13 -04:00
RecentClientCount = await Manager . GetClientService ( ) . GetRecentClientCount ( ) ,
Game = game ,
ActiveServerGames = Manager . GetServers ( ) . Select ( _server = > _server . GameName ) . Distinct ( ) . ToArray ( )
2019-07-24 11:36:37 -04:00
} ;
return View ( model ) ;
2018-02-21 20:29:23 -05:00
}
public IActionResult Error ( )
{
2018-05-14 13:55:10 -04:00
var exceptionFeature = HttpContext . Features . Get < IExceptionHandlerPathFeature > ( ) ;
2020-11-11 18:31:26 -05:00
_logger . LogError ( "[Webfront] {path} {message} {@exception}" , exceptionFeature . Path , exceptionFeature . Error . Message , exceptionFeature . Error ) ;
2018-05-05 18:52:04 -04:00
ViewBag . Description = Localization [ "WEBFRONT_ERROR_DESC" ] ;
ViewBag . Title = Localization [ "WEBFRONT_ERROR_TITLE" ] ;
2019-10-23 14:35:20 -04:00
return View ( exceptionFeature . Error ) ;
}
public IActionResult ResponseStatusCode ( int? statusCode = null )
{
return View ( statusCode ) ;
2018-02-21 20:29:23 -05:00
}
2019-12-28 21:44:39 -05:00
public IActionResult Help ( )
{
ViewBag . IsFluid = true ;
2019-12-29 12:32:36 -05:00
ViewBag . Title = Localization [ "WEBFRONT_NAV_HELP" ] ;
2020-07-31 21:40:03 -04:00
ViewBag . CommandPrefix = Manager . GetApplicationSettings ( ) . Configuration ( ) . CommandPrefix ;
2019-12-29 12:32:36 -05:00
// we don't need to the name of the shared library assembly
2019-12-28 21:44:39 -05:00
var excludedAssembly = typeof ( BaseController ) . Assembly ;
var commands = Manager . GetCommands ( )
2019-12-29 12:32:36 -05:00
. Where ( _cmd = > _cmd . Permission < = Client . Level )
2019-12-28 21:44:39 -05:00
. OrderByDescending ( _cmd = > _cmd . Permission )
. GroupBy ( _cmd = >
{
2019-12-29 12:32:36 -05:00
// we need the plugin type the command is defined in
2019-12-28 21:44:39 -05:00
var pluginType = _cmd . GetType ( ) . Assembly . GetTypes ( ) . FirstOrDefault ( _type = > _type . Assembly ! = excludedAssembly & & typeof ( IPlugin ) . IsAssignableFrom ( _type ) ) ;
return pluginType = = null ?
2020-05-11 17:10:43 -04:00
_translationLookup [ "WEBFRONT_HELP_COMMAND_NATIVE" ] :
pluginType . Name = = "ScriptPlugin" ? _translationLookup [ "WEBFRONT_HELP_SCRIPT_PLUGIN" ] :
2020-02-11 17:44:06 -05:00
Manager . Plugins . First ( _plugin = > _plugin . GetType ( ) = = pluginType ) . Name ; // for now we're just returning the name of the plugin, maybe later we'll include more info
2019-12-28 21:44:39 -05:00
} )
. Select ( _grp = > ( _grp . Key , _grp . AsEnumerable ( ) ) ) ;
return View ( commands ) ;
}
2018-02-21 20:29:23 -05:00
}
}