mirror of
https://github.com/EpinelPS/EpinelPS.git
synced 2025-12-13 07:24:52 +01:00
fix hard mode, disable ads in game, update admin panel
This commit is contained in:
@@ -163,6 +163,12 @@ namespace EpinelPS.Data
|
|||||||
[LoadRecord("ScenarioRewardsTable.json", "condition_id", typeof(ScenarioRewardTable))]
|
[LoadRecord("ScenarioRewardsTable.json", "condition_id", typeof(ScenarioRewardTable))]
|
||||||
public readonly Dictionary<string, ScenarioRewardRecord> ScenarioRewards = [];
|
public readonly Dictionary<string, ScenarioRewardRecord> ScenarioRewards = [];
|
||||||
|
|
||||||
|
// Note: same data types are intentional
|
||||||
|
[LoadRecord("ProductOfferTable.json", "id", typeof(ProductOfferTable))]
|
||||||
|
public readonly Dictionary<int, ProductOfferRecord> ProductOffers = [];
|
||||||
|
|
||||||
|
[LoadRecord("PopupPackageListTable.json", "id", typeof(ProductOfferTable))]
|
||||||
|
public readonly Dictionary<int, ProductOfferRecord> PopupPackages = [];
|
||||||
|
|
||||||
static async Task<GameData> BuildAsync()
|
static async Task<GameData> BuildAsync()
|
||||||
{
|
{
|
||||||
@@ -586,5 +592,20 @@ namespace EpinelPS.Data
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal string GetMapIdFromChapter(int chapter, int mod)
|
||||||
|
{
|
||||||
|
CampaignChapterRecord data = ChapterCampaignData[chapter - 1];
|
||||||
|
if (mod != 0)
|
||||||
|
return data.hard_field_id;
|
||||||
|
else return data.field_id;
|
||||||
|
}
|
||||||
|
internal string GetMapIdFromChapter(int chapter, string mod)
|
||||||
|
{
|
||||||
|
CampaignChapterRecord data = ChapterCampaignData[chapter - 1];
|
||||||
|
if (mod == "Hard")
|
||||||
|
return data.hard_field_id;
|
||||||
|
else return data.field_id;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -760,4 +760,14 @@
|
|||||||
{
|
{
|
||||||
public List<ScenarioRewardRecord> records = [];
|
public List<ScenarioRewardRecord> records = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class ProductOfferRecord
|
||||||
|
{
|
||||||
|
public int id;
|
||||||
|
}
|
||||||
|
public class ProductOfferTable
|
||||||
|
{
|
||||||
|
public List<ProductOfferRecord> records = [];
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -587,7 +587,6 @@ namespace EpinelPS.Database
|
|||||||
public List<AccessToken> LauncherAccessTokens = [];
|
public List<AccessToken> LauncherAccessTokens = [];
|
||||||
public Dictionary<string, ulong> AdminAuthTokens = new();
|
public Dictionary<string, ulong> AdminAuthTokens = new();
|
||||||
|
|
||||||
public string ServerName = "<color=\"green\">Private Server</color>";
|
|
||||||
public byte[] LauncherTokenKey = [];
|
public byte[] LauncherTokenKey = [];
|
||||||
public byte[] EncryptionTokenKey = [];
|
public byte[] EncryptionTokenKey = [];
|
||||||
public LogType LogLevel = LogType.Debug;
|
public LogType LogLevel = LogType.Debug;
|
||||||
@@ -679,6 +678,45 @@ namespace EpinelPS.Database
|
|||||||
}
|
}
|
||||||
Console.WriteLine("Database update completed");
|
Console.WriteLine("Database update completed");
|
||||||
}
|
}
|
||||||
|
if (Instance.DbVersion == 4)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Starting database update...");
|
||||||
|
Instance.DbVersion = 5;
|
||||||
|
// FieldInfoNew uses MapId instead of ChapterNum_ChapterDifficulty format
|
||||||
|
foreach (var user in Instance.Users)
|
||||||
|
{
|
||||||
|
Dictionary<string, FieldInfoNew> info = new();
|
||||||
|
foreach (var item in user.FieldInfoNew)
|
||||||
|
{
|
||||||
|
if (item.Key.EndsWith("_Normal") || item.Key.EndsWith("_Hard"))
|
||||||
|
{
|
||||||
|
var newKey = GameData.Instance.GetMapIdFromDBFieldName(item.Key);
|
||||||
|
if (newKey != null)
|
||||||
|
{
|
||||||
|
if (!info.ContainsKey(newKey))
|
||||||
|
{
|
||||||
|
info.Add(newKey, item.Value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// overwrite old data
|
||||||
|
info[newKey] = item.Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Console.WriteLine("Unknown chapter/difficulty: " + item.Value + ", discarding");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!info.ContainsKey(item.Key))
|
||||||
|
info.Add(item.Key, item.Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
user.FieldInfoNew = info;
|
||||||
|
}
|
||||||
|
Console.WriteLine("Database update completed");
|
||||||
|
}
|
||||||
|
|
||||||
if (Instance.LauncherTokenKey.Length == 0)
|
if (Instance.LauncherTokenKey.Length == 0)
|
||||||
{
|
{
|
||||||
@@ -699,6 +737,8 @@ namespace EpinelPS.Database
|
|||||||
|
|
||||||
Save();
|
Save();
|
||||||
|
|
||||||
|
Logging.SetOutputLevel(Instance.LogLevel);
|
||||||
|
|
||||||
ValidateDb();
|
ValidateDb();
|
||||||
Console.WriteLine("JsonDb: Loaded");
|
Console.WriteLine("JsonDb: Loaded");
|
||||||
}
|
}
|
||||||
@@ -706,6 +746,7 @@ namespace EpinelPS.Database
|
|||||||
{
|
{
|
||||||
throw new Exception("Failed to read configuration json file");
|
throw new Exception("Failed to read configuration json file");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Reload()
|
public static void Reload()
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ namespace EpinelPS.LobbyServer.Campaign
|
|||||||
Console.WriteLine("Map ID: " + req.MapId);
|
Console.WriteLine("Map ID: " + req.MapId);
|
||||||
|
|
||||||
var response = new ResGetCampaignFieldData();
|
var response = new ResGetCampaignFieldData();
|
||||||
response.Field = GetStage.CreateFieldInfo(user, GameData.Instance.GetNormalChapterNumberFromFieldName(req.MapId), req.MapId.Contains("hard") ? "Hard" : "Normal", out bool bossEntered);
|
response.Field = GetStage.CreateFieldInfo(user, req.MapId, out bool bossEntered);
|
||||||
|
|
||||||
// todo save this data
|
// todo save this data
|
||||||
response.Team = new NetUserTeamData() { LastContentsTeamNumber = 1, Type = 1 };
|
response.Team = new NetUserTeamData() { LastContentsTeamNumber = 1, Type = 1 };
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ namespace EpinelPS.LobbyServer.Campaign
|
|||||||
{
|
{
|
||||||
response.FieldObjectItemsNum.Add(new NetCampaignFieldObjectItemsNum()
|
response.FieldObjectItemsNum.Add(new NetCampaignFieldObjectItemsNum()
|
||||||
{
|
{
|
||||||
MapId = GameData.Instance.GetMapIdFromDBFieldName(map.Key),
|
MapId = map.Key,
|
||||||
Count = map.Value.CompletedObjects.Count
|
Count = map.Value.CompletedObjects.Count
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,20 +15,10 @@ namespace EpinelPS.LobbyServer.Campaign
|
|||||||
|
|
||||||
var response = new ResObtainCampaignItem();
|
var response = new ResObtainCampaignItem();
|
||||||
|
|
||||||
var chapter = GameData.Instance.GetNormalChapterNumberFromFieldName(req.MapId);
|
if (!user.FieldInfoNew.TryGetValue(req.MapId, out FieldInfoNew? field))
|
||||||
var mod = req.MapId.Contains("hard") ? "Hard" : "Normal";
|
|
||||||
var key = chapter + "_" + mod;
|
|
||||||
|
|
||||||
if (chapter == -1)
|
|
||||||
{
|
|
||||||
Logging.WriteLine("Warning: unknown chapter id for " + req.MapId, LogType.Warning);
|
|
||||||
key = req.MapId;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!user.FieldInfoNew.TryGetValue(key, out FieldInfoNew? field))
|
|
||||||
{
|
{
|
||||||
field = new FieldInfoNew();
|
field = new FieldInfoNew();
|
||||||
user.FieldInfoNew.Add(key, field);
|
user.FieldInfoNew.Add(req.MapId, field);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -16,10 +16,7 @@ namespace EpinelPS.LobbyServer.Campaign
|
|||||||
|
|
||||||
Logging.WriteLine($"save {req.MapId} with {req.FieldObject.PositionId}", LogType.Debug);
|
Logging.WriteLine($"save {req.MapId} with {req.FieldObject.PositionId}", LogType.Debug);
|
||||||
|
|
||||||
var chapter = GameData.Instance.GetNormalChapterNumberFromFieldName(req.MapId);
|
var field = user.FieldInfoNew[req.MapId];
|
||||||
var mod = req.MapId.Contains("hard") ? "Hard" : "Normal";
|
|
||||||
var key = chapter + "_" + mod;
|
|
||||||
var field = user.FieldInfoNew[key];
|
|
||||||
|
|
||||||
field.CompletedObjects.Add(new NetFieldObject() { PositionId = req.FieldObject.PositionId, Json = req.FieldObject.Json, Type = req.FieldObject.Type });
|
field.CompletedObjects.Add(new NetFieldObject() { PositionId = req.FieldObject.PositionId, Json = req.FieldObject.Json, Type = req.FieldObject.Type });
|
||||||
JsonDb.Save();
|
JsonDb.Save();
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using EpinelPS.Data;
|
||||||
using EpinelPS.Utils;
|
using EpinelPS.Utils;
|
||||||
|
|
||||||
namespace EpinelPS.LobbyServer.Shop
|
namespace EpinelPS.LobbyServer.Shop
|
||||||
@@ -9,9 +10,12 @@ namespace EpinelPS.LobbyServer.Shop
|
|||||||
{
|
{
|
||||||
var x = await ReadData<ReqListSeenProductOffer>();
|
var x = await ReadData<ReqListSeenProductOffer>();
|
||||||
|
|
||||||
// TODO: Figure out a way to disable ads
|
// Disable in game ads
|
||||||
|
|
||||||
var response = new ResListSeenProductOffer();
|
var response = new ResListSeenProductOffer();
|
||||||
|
foreach(var item in GameData.Instance.ProductOffers)
|
||||||
|
{
|
||||||
|
response.Result.Add(new NetUserProductOfferSeenHistory() { ProductOfferId = item.Key });
|
||||||
|
}
|
||||||
|
|
||||||
await WriteDataAsync(response);
|
await WriteDataAsync(response);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ namespace EpinelPS.LobbyServer.Shop.InApp
|
|||||||
|
|
||||||
var response = new ResGetInAppShopData();
|
var response = new ResGetInAppShopData();
|
||||||
|
|
||||||
// TODO
|
response.InAppShopDataList.Add(new NetInAppShopData() { Id = 10001, StartDate = DateTime.Now.Ticks, EndDate = DateTime.Now.AddDays(2).Ticks });
|
||||||
|
|
||||||
await WriteDataAsync(response);
|
await WriteDataAsync(response);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using EpinelPS.Utils;
|
using EpinelPS.Data;
|
||||||
|
using EpinelPS.Utils;
|
||||||
|
|
||||||
namespace EpinelPS.LobbyServer.Shop.PackageShop
|
namespace EpinelPS.LobbyServer.Shop.PackageShop
|
||||||
{
|
{
|
||||||
@@ -10,6 +11,11 @@ namespace EpinelPS.LobbyServer.Shop.PackageShop
|
|||||||
var req = await ReadData<ReqGetPopupPackageState>();
|
var req = await ReadData<ReqGetPopupPackageState>();
|
||||||
|
|
||||||
var response = new ResGetPopupPackageState();
|
var response = new ResGetPopupPackageState();
|
||||||
|
|
||||||
|
// disable ads
|
||||||
|
foreach (var item in GameData.Instance.PopupPackages)
|
||||||
|
response.AppearedList.Add(item.Key);
|
||||||
|
|
||||||
await WriteDataAsync(response);
|
await WriteDataAsync(response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,15 +31,16 @@ namespace EpinelPS.LobbyServer.Stage
|
|||||||
var response = new ResClearStage();
|
var response = new ResClearStage();
|
||||||
var clearedStage = GameData.Instance.GetStageData(StageId) ?? throw new Exception("cleared stage cannot be null");
|
var clearedStage = GameData.Instance.GetStageData(StageId) ?? throw new Exception("cleared stage cannot be null");
|
||||||
|
|
||||||
|
var stageMapId = GameData.Instance.GetMapIdFromChapter(clearedStage.chapter_id, clearedStage.chapter_mod);
|
||||||
|
|
||||||
if (user.FieldInfoNew.Count == 0)
|
if (user.FieldInfoNew.Count == 0)
|
||||||
{
|
{
|
||||||
user.FieldInfoNew.Add("0_" + clearedStage.chapter_mod, new FieldInfoNew() { });
|
user.FieldInfoNew.Add(stageMapId, new FieldInfoNew() { });
|
||||||
}
|
}
|
||||||
|
|
||||||
DoQuestSpecificUserOperations(user, StageId);
|
DoQuestSpecificUserOperations(user, StageId);
|
||||||
var rewardData = GameData.Instance.GetRewardTableEntry(clearedStage.reward_id);
|
var rewardData = GameData.Instance.GetRewardTableEntry(clearedStage.reward_id);
|
||||||
|
|
||||||
|
|
||||||
if (forceCompleteScenarios)
|
if (forceCompleteScenarios)
|
||||||
{
|
{
|
||||||
if (!user.CompletedScenarios.Contains(clearedStage.enter_scenario) && !string.IsNullOrEmpty(clearedStage.enter_scenario) && !string.IsNullOrWhiteSpace(clearedStage.enter_scenario))
|
if (!user.CompletedScenarios.Contains(clearedStage.enter_scenario) && !string.IsNullOrEmpty(clearedStage.enter_scenario) && !string.IsNullOrWhiteSpace(clearedStage.enter_scenario))
|
||||||
@@ -144,13 +145,10 @@ namespace EpinelPS.LobbyServer.Stage
|
|||||||
user.AddTrigger(TriggerType.ChapterClear, 1, clearedStage.chapter_id);
|
user.AddTrigger(TriggerType.ChapterClear, 1, clearedStage.chapter_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateClearInfo(user);
|
if (!user.FieldInfoNew.ContainsKey(stageMapId))
|
||||||
|
user.FieldInfoNew.Add(stageMapId, new FieldInfoNew());
|
||||||
|
|
||||||
var key = (clearedStage.chapter_id - 1) + "_" + clearedStage.chapter_mod;
|
user.FieldInfoNew[stageMapId].CompletedStages.Add(StageId);
|
||||||
if (!user.FieldInfoNew.ContainsKey(key))
|
|
||||||
user.FieldInfoNew.Add(key, new FieldInfoNew());
|
|
||||||
|
|
||||||
user.FieldInfoNew[key].CompletedStages.Add(StageId);
|
|
||||||
JsonDb.Save();
|
JsonDb.Save();
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,15 +15,15 @@ namespace EpinelPS.LobbyServer.Stage
|
|||||||
var response = new ResEnterStage();
|
var response = new ResEnterStage();
|
||||||
|
|
||||||
var clearedStage = GameData.Instance.GetStageData(req.StageId) ?? throw new Exception("cleared stage cannot be null");
|
var clearedStage = GameData.Instance.GetStageData(req.StageId) ?? throw new Exception("cleared stage cannot be null");
|
||||||
|
var map = GameData.Instance.GetMapIdFromChapter(clearedStage.chapter_id, clearedStage.chapter_id);
|
||||||
|
|
||||||
if (clearedStage.stage_category == "Boss")
|
if (clearedStage.stage_category == "Boss")
|
||||||
{
|
{
|
||||||
// When entering a boss stage, unlock boss information in campaign
|
// When entering a boss stage, unlock boss information in campaign
|
||||||
var key = (clearedStage.chapter_id - 1) + "_" + clearedStage.chapter_mod;
|
if (!user.FieldInfoNew.ContainsKey(map))
|
||||||
if (!user.FieldInfoNew.ContainsKey(key))
|
user.FieldInfoNew.Add(map, new FieldInfoNew());
|
||||||
user.FieldInfoNew.Add(key, new FieldInfoNew());
|
|
||||||
|
|
||||||
if (user.FieldInfoNew.TryGetValue(key, out FieldInfoNew? info))
|
if (user.FieldInfoNew.TryGetValue(map, out FieldInfoNew? info))
|
||||||
info.BossEntered = true;
|
info.BossEntered = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using EpinelPS.Database;
|
using EpinelPS.Data;
|
||||||
|
using EpinelPS.Database;
|
||||||
using EpinelPS.Utils;
|
using EpinelPS.Utils;
|
||||||
|
|
||||||
namespace EpinelPS.LobbyServer.Stage
|
namespace EpinelPS.LobbyServer.Stage
|
||||||
@@ -11,9 +12,11 @@ namespace EpinelPS.LobbyServer.Stage
|
|||||||
ReqGetStageData req = await ReadData<ReqGetStageData>();
|
ReqGetStageData req = await ReadData<ReqGetStageData>();
|
||||||
var user = GetUser();
|
var user = GetUser();
|
||||||
|
|
||||||
|
var mapId = GameData.Instance.GetMapIdFromChapter(req.Chapter, req.Mod);
|
||||||
|
|
||||||
ResGetStageData response = new()
|
ResGetStageData response = new()
|
||||||
{
|
{
|
||||||
Field = CreateFieldInfo(user, req.Chapter - 1, req.Mod == 0 ? "Normal" : "Hard", out bool bossEntered),
|
Field = CreateFieldInfo(user, mapId, out bool bossEntered),
|
||||||
HasChapterBossEntered = bossEntered,
|
HasChapterBossEntered = bossEntered,
|
||||||
SquadData = ""
|
SquadData = ""
|
||||||
};
|
};
|
||||||
@@ -21,15 +24,14 @@ namespace EpinelPS.LobbyServer.Stage
|
|||||||
await WriteDataAsync(response);
|
await WriteDataAsync(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static NetFieldObjectData CreateFieldInfo(Database.User user, int chapter, string mod, out bool BossEntered)
|
public static NetFieldObjectData CreateFieldInfo(User user, string mapId, out bool BossEntered)
|
||||||
{
|
{
|
||||||
var f = new NetFieldObjectData();
|
var f = new NetFieldObjectData();
|
||||||
bool found = false;
|
bool found = false;
|
||||||
string key = chapter + "_" + mod;
|
|
||||||
BossEntered = false;
|
BossEntered = false;
|
||||||
foreach (var item in user.FieldInfoNew)
|
foreach (var item in user.FieldInfoNew)
|
||||||
{
|
{
|
||||||
if (item.Key == key)
|
if (item.Key == mapId)
|
||||||
{
|
{
|
||||||
found = true;
|
found = true;
|
||||||
foreach (var stage in item.Value.CompletedStages)
|
foreach (var stage in item.Value.CompletedStages)
|
||||||
@@ -47,8 +49,8 @@ namespace EpinelPS.LobbyServer.Stage
|
|||||||
|
|
||||||
if (!found)
|
if (!found)
|
||||||
{
|
{
|
||||||
user.FieldInfoNew.Add(key, new FieldInfoNew());
|
user.FieldInfoNew.Add(mapId, new FieldInfoNew());
|
||||||
return CreateFieldInfo(user, chapter, mod, out BossEntered);
|
return CreateFieldInfo(user, mapId, out BossEntered);
|
||||||
}
|
}
|
||||||
|
|
||||||
return f;
|
return f;
|
||||||
|
|||||||
@@ -20,12 +20,14 @@ namespace EpinelPS
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
Console.WriteLine($"EpinelPS v{Assembly.GetExecutingAssembly().GetName().Version} - https://github.com/EpinelPS/EpinelPS/");
|
Console.WriteLine($"EpinelPS v{Assembly.GetExecutingAssembly().GetName().Version} - https://github.com/EpinelPS/EpinelPS/");
|
||||||
Console.WriteLine("Targeting Game Version " + GameConfig.Root.GameMaxVer);
|
Console.WriteLine("This software is licensed under the AGPL-3.0 License");
|
||||||
Console.WriteLine("Initializing database");
|
Console.WriteLine("Targeting game version " + GameConfig.Root.GameMaxVer);
|
||||||
JsonDb.Save();
|
|
||||||
|
|
||||||
GameData.Instance.GetAllCostumes(); // force static data to be loaded
|
GameData.Instance.GetAllCostumes(); // force static data to be loaded
|
||||||
|
|
||||||
|
Console.WriteLine("Initializing database");
|
||||||
|
JsonDb.Save();
|
||||||
|
|
||||||
Logging.WriteLine("Register handlers");
|
Logging.WriteLine("Register handlers");
|
||||||
LobbyHandler.Init();
|
LobbyHandler.Init();
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,10 @@ namespace EpinelPS.Utils
|
|||||||
public string ResourceBaseURL { get; set; } = "";
|
public string ResourceBaseURL { get; set; } = "";
|
||||||
public string GameMinVer { get; set; } = "";
|
public string GameMinVer { get; set; } = "";
|
||||||
public string GameMaxVer { get; set; } = "";
|
public string GameMaxVer { get; set; } = "";
|
||||||
|
/// <summary>
|
||||||
|
/// this is only for displaying the target version in admin console or cli
|
||||||
|
/// </summary>
|
||||||
|
public string TargetVersion { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class StaticData
|
public class StaticData
|
||||||
|
|||||||
@@ -3,8 +3,13 @@ using EpinelPS.Database;
|
|||||||
|
|
||||||
namespace EpinelPS.Utils
|
namespace EpinelPS.Utils
|
||||||
{
|
{
|
||||||
public class Logging
|
public static class Logging
|
||||||
{
|
{
|
||||||
|
private static LogType LogLevel = LogType.Info;
|
||||||
|
public static void SetOutputLevel(LogType level)
|
||||||
|
{
|
||||||
|
LogLevel = level;
|
||||||
|
}
|
||||||
public static void WriteLine(string msg, LogType level = LogType.Info)
|
public static void WriteLine(string msg, LogType level = LogType.Info)
|
||||||
{
|
{
|
||||||
var originalFG = Console.ForegroundColor;
|
var originalFG = Console.ForegroundColor;
|
||||||
@@ -13,7 +18,7 @@ namespace EpinelPS.Utils
|
|||||||
// todo write to some file
|
// todo write to some file
|
||||||
|
|
||||||
|
|
||||||
if (JsonDb.Instance.LogLevel <= level)
|
if (LogLevel <= level)
|
||||||
Console.WriteLine(msg);
|
Console.WriteLine(msg);
|
||||||
|
|
||||||
Console.ForegroundColor = originalFG;
|
Console.ForegroundColor = originalFG;
|
||||||
|
|||||||
@@ -138,7 +138,6 @@ a.nav-link:hover:after {
|
|||||||
width: 28px;
|
width: 28px;
|
||||||
height: 28px;
|
height: 28px;
|
||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
background-image: url('/admin/assets/img/nikke-logo-icon.png');
|
|
||||||
background-size: contain;
|
background-size: contain;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
{
|
{
|
||||||
"app": {
|
"app": {
|
||||||
"name": "NIKKE Admin Console",
|
"name": "EpinelPS Admin Console",
|
||||||
"version": "Version v2.5.3",
|
"version": "Version v1.0.0",
|
||||||
"footer": "© 2025 - NIKKE: Goddess of Victory - Admin Console"
|
"footer": "© 2025 EpinelPS"
|
||||||
},
|
},
|
||||||
"auth": {
|
"auth": {
|
||||||
"login": "Login",
|
"login": "Login",
|
||||||
"username": "Username",
|
"username": "Username",
|
||||||
"password": "Password",
|
"password": "Password",
|
||||||
"enter": "Enter Console",
|
"enter": "Login",
|
||||||
"welcome": "Please login to access admin features",
|
"welcome": "Please login",
|
||||||
"verifying": "Verifying...",
|
"verifying": "Verifying...",
|
||||||
"success": "Login successful",
|
"success": "Login successful",
|
||||||
"error": {
|
"error": {
|
||||||
@@ -49,7 +49,7 @@
|
|||||||
},
|
},
|
||||||
"dashboard": {
|
"dashboard": {
|
||||||
"title": "Console Overview",
|
"title": "Console Overview",
|
||||||
"refresh": "Refresh Data",
|
"refresh": "Refresh",
|
||||||
"refreshing": "Refreshing...",
|
"refreshing": "Refreshing...",
|
||||||
"statsCards": {
|
"statsCards": {
|
||||||
"users": "Registered Users",
|
"users": "Registered Users",
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"app": {
|
"app": {
|
||||||
"name": "NIKKEアドミンコンソール",
|
"name": "EpinelPSアドミンコンソール",
|
||||||
"version": "バージョン v2.5.3",
|
"version": "バージョン v1.0.0",
|
||||||
"footer": "© 2025 - NIKKE: 勝利の女神 - アドミンコンソール"
|
"footer": "© 2025 EpinelPS"
|
||||||
},
|
},
|
||||||
"auth": {
|
"auth": {
|
||||||
"login": "ログイン",
|
"login": "ログイン",
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"app": {
|
"app": {
|
||||||
"name": "NIKKE 관리 콘솔",
|
"name": "EpinelPS 관리 콘솔",
|
||||||
"version": "버전 v2.5.3",
|
"version": "버전 v1.0.0",
|
||||||
"footer": "© 2025 - NIKKE: 승리의 여신 - 관리 콘솔"
|
"footer": "© 2025 EpinelPS"
|
||||||
},
|
},
|
||||||
"auth": {
|
"auth": {
|
||||||
"login": "로그인",
|
"login": "로그인",
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"app": {
|
"app": {
|
||||||
"name": "胜利女神控制台",
|
"name": "胜利女神控制台",
|
||||||
"version": "版本 v2.5.3",
|
"version": "版本 v1.0.0",
|
||||||
"footer": "© 2025 - NIKKE: 胜利女神 - 管理控制台"
|
"footer": "© 2025 EpinelPS"
|
||||||
},
|
},
|
||||||
"auth": {
|
"auth": {
|
||||||
"login": "登录",
|
"login": "登录",
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||||
<title data-i18n="app.name">NIKKE: 胜利女神 - 管理控制台</title>
|
<title data-i18n="app.name">EpinelPS</title>
|
||||||
|
|
||||||
<!-- 字体 -->
|
<!-- 字体 -->
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
@@ -32,7 +32,6 @@
|
|||||||
<div class="login-container">
|
<div class="login-container">
|
||||||
<div class="login-box">
|
<div class="login-box">
|
||||||
<div class="login-header">
|
<div class="login-header">
|
||||||
<img src="/admin/assets/img/nikke-logo.png" alt="NIKKE" class="logo">
|
|
||||||
<h1 data-i18n="app.name">胜利女神控制台</h1>
|
<h1 data-i18n="app.name">胜利女神控制台</h1>
|
||||||
<p data-i18n="auth.welcome">请登录以访问管理功能</p>
|
<p data-i18n="auth.welcome">请登录以访问管理功能</p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user