update file localizations

update custom callbacks
add server count to master
add most played to token list
This commit is contained in:
RaidMax 2018-05-21 16:09:27 -05:00
parent be68335f70
commit 36d493f05b
14 changed files with 1181 additions and 1052 deletions

View File

@ -66,9 +66,9 @@
"COMMANDS_OWNER_SUCCESS": "Congratulations, you have claimed ownership of this server!",
"COMMANDS_PASSWORD_FAIL": "Your password must be at least 5 characters long",
"COMMANDS_PASSWORD_SUCCESS": "Your password has been set successfully",
"COMMANDS_PING_DESC": "get client's ping",
"COMMANDS_PING_SELF": "Your ping is",
"COMMANDS_PING_TARGET": "ping is",
"COMMANDS_PING_DESC": "get client's latency",
"COMMANDS_PING_SELF": "Your latency is",
"COMMANDS_PING_TARGET": "latency is",
"COMMANDS_PLUGINS_DESC": "view all loaded plugins",
"COMMANDS_PLUGINS_LOADED": "Loaded Plugins",
"COMMANDS_PM_DESC": "send message to other client",
@ -116,7 +116,6 @@
"COMMANDS_WHO_DESC": "give information about yourself",
"GLOBAL_DAYS": "days",
"GLOBAL_ERROR": "Error",
"GLOBAL_DEBUG": "Debug",
"GLOBAL_HOURS": "hours",
"GLOBAL_INFO": "Info",
"GLOBAL_MINUTES": "minutes",
@ -253,7 +252,18 @@
"PLUGINS_LOGIN_AUTH": "not logged in",
"PLUGINS_PROFANITY_SETUP_ENABLE": "Enable profanity deterring",
"PLUGINS_PROFANITY_WARNMSG": "Please do not use profanity on this server",
"PLUGINS_PROFANITY_KICKMSG": "Excessive use of profanity"
"PLUGINS_PROFANITY_KICKMSG": "Excessive use of profanity",
"GLOBAL_DEBUG": "Debug",
"COMMANDS_UNFLAG_DESC": "Remove flag for client",
"COMMANDS_UNFLAG_FAIL": "You cannot unflag",
"COMMANDS_UNFLAG_NOTFLAGGED": "Client is not flagged",
"COMMANDS_FLAG_ALREADYFLAGGED": "Client is already flagged",
"PLUGINS_STATS_COMMANDS_MOSTPLAYED_TEXT": "Most Played",
"PLUGINS_STATS_COMMANDS_MOSTPLAYED_DESC": "view the top 5 dedicated players on the server",
"WEBFRONT_PROFILE_MESSAGES": "Messages",
"WEBFRONT_CLIENT_META_CONNECTIONS": "Connections",
"PLUGINS_STATS_COMMANDS_TOPSTATS_RATING": "Rating",
"PLUGINS_STATS_COMMANDS_PERFORMANCE": "Performance"
}
}
}

View File

@ -252,7 +252,18 @@
"PLUGINS_LOGIN_AUTH": "No registrado",
"PLUGINS_PROFANITY_SETUP_ENABLE": "Habilitar la disuasión de blasfemias",
"PLUGINS_PROFANITY_WARNMSG": "Por favor no uses blasfemias en este servidor",
"PLUGINS_PROFANITY_KICKMSG": "Excesivo uso de blasfemias"
"PLUGINS_PROFANITY_KICKMSG": "Excesivo uso de blasfemias",
"GLOBAL_DEBUG": "Depurar",
"COMMANDS_UNFLAG_DESC": "Remover marca del cliente",
"COMMANDS_UNFLAG_FAIL": "Tu no puedes desmarcar",
"COMMANDS_UNFLAG_NOTFLAGGED": "El cliente no está marcado",
"COMMANDS_FLAG_ALREADYFLAGGED": "El cliente yá se encuentra marcado",
"PLUGINS_STATS_COMMANDS_MOSTPLAYED_TEXT": "Más jugado",
"PLUGINS_STATS_COMMANDS_MOSTPLAYED_DESC": "ver el Top 5 de jugadores dedicados en el servidor",
"WEBFRONT_PROFILE_MESSAGES": "Mensajes",
"WEBFRONT_CLIENT_META_CONNECTIONS": "Conexiones",
"PLUGINS_STATS_COMMANDS_TOPSTATS_RATING": "Clasificación",
"PLUGINS_STATS_COMMANDS_PERFORMANCE": "Desempeño"
}
}
}

View File

@ -82,7 +82,7 @@
"COMMANDS_REPORT_FAIL": "Você não pode reportar",
"COMMANDS_REPORT_FAIL_CAMP": "Você não pode denunciar o jogador por camperar",
"COMMANDS_REPORT_FAIL_DUPLICATE": "Você já denunciou o jogador",
"COMMANDS_REPORT_FAIL_SELF": "Você não pode se reportar",
"COMMANDS_REPORT_FAIL_SELF": "Você não pode reportar a si mesmo",
"COMMANDS_REPORT_SUCCESS": "Obrigado pela sua denúncia, um administrador foi notificado",
"COMMANDS_REPORTS_CLEAR_SUCCESS": "Lista de denúncias limpa com sucesso",
"COMMANDS_REPORTS_DESC": "obtém ou limpa as denúncias recentes",
@ -109,7 +109,7 @@
"COMMANDS_UPTIME_TEXT": "está online por",
"COMMANDS_USAGE_DESC": "vê quanto o aplicativo está usando de memória RAM do seu computador",
"COMMANDS_USAGE_TEXT": "está usando",
"COMMANDS_WARN_DESC": "adverte o cliente por infringir regras",
"COMMANDS_WARN_DESC": "adverte o cliente por infringir as regras",
"COMMANDS_WARN_FAIL": "Você não tem os privilégios necessários para advertir",
"COMMANDS_WARNCLEAR_DESC": "remove todos os avisos para um cliente",
"COMMANDS_WARNCLEAR_SUCCESS": "Todos as advertências foram apagados para",
@ -252,7 +252,18 @@
"PLUGINS_LOGIN_AUTH": "não está registrado",
"PLUGINS_PROFANITY_SETUP_ENABLE": "Habilitar o plugin de anti-palavrão",
"PLUGINS_PROFANITY_WARNMSG": "Por favor, não use palavras ofensivas neste servidor",
"PLUGINS_PROFANITY_KICKMSG": "Uso excessivo de palavrão, lave a boca da próxima vez"
"PLUGINS_PROFANITY_KICKMSG": "Uso excessivo de palavrão, lave a boca da próxima vez",
"GLOBAL_DEBUG": "Depuração",
"COMMANDS_UNFLAG_DESC": "Remover a sinalização do jogador",
"COMMANDS_UNFLAG_FAIL": "Você não pode retirar a sinalização do jogador",
"COMMANDS_UNFLAG_NOTFLAGGED": "O jogador não está sinalizado",
"COMMANDS_FLAG_ALREADYFLAGGED": "O jogador já está sinalizado",
"PLUGINS_STATS_COMMANDS_MOSTPLAYED_TEXT": "Mais jogado",
"PLUGINS_STATS_COMMANDS_MOSTPLAYED_DESC": "ver o top 5 de jogadores mais dedicados no servidor",
"WEBFRONT_PROFILE_MESSAGES": "Mensagens",
"WEBFRONT_CLIENT_META_CONNECTIONS": "Conexões",
"PLUGINS_STATS_COMMANDS_TOPSTATS_RATING": "Classificação",
"PLUGINS_STATS_COMMANDS_PERFORMANCE": "Desempenho"
}
}
}

View File

@ -5,7 +5,7 @@
"BROADCAST_OFFLINE": "^5IW4MAdmin ^1ВЫКЛЮЧАЕТСЯ",
"BROADCAST_ONLINE": "^5IW4MADMIN ^7сейчас В СЕТИ",
"COMMAND_HELP_OPTIONAL": "опционально",
"COMMAND_HELP_SYNTAX": "синтаксис:",
"COMMAND_HELP_SYNTAX": "Проблема с выражением мысли ( пересмотри слова)",
"COMMAND_MISSINGARGS": "Приведено недостаточно аргументов",
"COMMAND_NOACCESS": "У вас нет доступа к этой команде",
"COMMAND_NOTAUTHORIZED": "Вы не авторизованы для исполнения этой команды",
@ -42,8 +42,8 @@
"COMMANDS_FIND_MIN": "Пожалуйста, введите хотя бы 3 символа",
"COMMANDS_FLAG_DESC": "отметить подозрительного игрока и сообщить администраторам, чтобы присоединились",
"COMMANDS_FLAG_FAIL": "Вы не можете ставить отметки",
"COMMANDS_FLAG_SUCCESS": "Вы были отмечены",
"COMMANDS_FLAG_UNFLAG": "С вас сняли отметку",
"COMMANDS_FLAG_SUCCESS": "Вы отметили",
"COMMANDS_FLAG_UNFLAG": "Вы сняли отметку",
"COMMANDS_HELP_DESC": "перечислить все доступные команды",
"COMMANDS_HELP_MOREINFO": "Введите !help <имя команды>, чтобы узнать синтаксис для использования команды",
"COMMANDS_HELP_NOTFOUND": "Не удалось найти эту команду",
@ -207,7 +207,7 @@
"WEBFRONT_CLIENT_META_FALSE": "не",
"WEBFRONT_CLIENT_META_JOINED": "Присоединился с именем",
"WEBFRONT_CLIENT_META_MASKED": "Замаскирован",
"WEBFRONT_CLIENT_META_TRUE": "",
"WEBFRONT_CLIENT_META_TRUE": "Это",
"WEBFRONT_CLIENT_PRIVILEGED_TITLE": "Игроки с правами",
"WEBFRONT_CLIENT_PROFILE_TITLE": "Профиль",
"WEBFRONT_CLIENT_SEARCH_MATCHING": "Подходящие игроки",
@ -219,8 +219,8 @@
"WEBFRONT_ERROR_TITLE": "Ошибка!",
"WEBFRONT_HOME_TITLE": "Обзор сервера",
"WEBFRONT_NAV_CONSOLE": "Консоль",
"WEBFRONT_NAV_DISCORD": "Discord",
"WEBFRONT_NAV_HOME": "Домой",
"WEBFRONT_NAV_DISCORD": "Дискорд ",
"WEBFRONT_NAV_HOME": "Обзор Серверов ",
"WEBFRONT_NAV_LOGOUT": "Выйти",
"WEBFRONT_NAV_PENALTIES": "Наказания",
"WEBFRONT_NAV_PRIVILEGED": "Админы",
@ -244,15 +244,26 @@
"PLUGIN_STATS_SETUP_ENABLEAC": "Включить серверный античит (только IW4)",
"PLUGIN_STATS_ERROR_ADD": "Не удалось добавить сервер в статистику серверов",
"PLUGIN_STATS_CHEAT_DETECTED": "Кажется, вы читерите",
"PLUGINS_STATS_TEXT_KDR": "Соотношение У/C",
"PLUGINS_STATS_TEXT_KDR": "Вот так ..",
"PLUGINS_STATS_META_SPM": "Счёт за минуту",
"PLUGINS_WELCOME_USERANNOUNCE": "^5{{ClientName}} ^7из ^5{{ClientLocation}}",
"PLUGINS_WELCOME_USERWELCOME": "Добро пожаловать, ^5{{ClientName}}^7. Это ваше ^5{{TimesConnected}} ^7подключение по счёту!",
"PLUGINS_WELCOME_PRIVANNOUNCE": "{{ClientLevel}} {{ClientName}} присоединился к серверу",
"PLUGINS_LOGIN_AUTH": "не вошёл",
"PLUGINS_LOGIN_AUTH": "Сперва Подключись",
"PLUGINS_PROFANITY_SETUP_ENABLE": "Включить сдерживание ненормативной лексики",
"PLUGINS_PROFANITY_WARNMSG": "Пожалуйта, не ругайтесь на этом сервере",
"PLUGINS_PROFANITY_KICKMSG": "Чрезмерное употребление ненормативной лексики"
"PLUGINS_PROFANITY_KICKMSG": "Чрезмерное употребление ненормативной лексики",
"GLOBAL_DEBUG": "Отлаживание ",
"COMMANDS_UNFLAG_DESC": "Снять все подозрение с игрока !",
"COMMANDS_UNFLAG_FAIL": "Вы не можете снять подозрения..",
"COMMANDS_UNFLAG_NOTFLAGGED": "Игрок без подозрения !",
"COMMANDS_FLAG_ALREADYFLAGGED": "Игрок помечен ! ",
"PLUGINS_STATS_COMMANDS_MOSTPLAYED_TEXT": "Самые популярные",
"PLUGINS_STATS_COMMANDS_MOSTPLAYED_DESC": "просмотр 5 лучших игроков на сервере",
"WEBFRONT_PROFILE_MESSAGES": "Сообщения",
"WEBFRONT_CLIENT_META_CONNECTIONS": "Подключения",
"PLUGINS_STATS_COMMANDS_TOPSTATS_RATING": "Рейтинг",
"PLUGINS_STATS_COMMANDS_PERFORMANCE": "Эффективность"
}
}
}

View File

@ -37,6 +37,7 @@ class Base():
client_num += server.clientnum
self.history.add_client_history(client_num)
self.history.add_instance_history(len(self.instance_list))
self.history.add_server_history(len(servers))
def _remove_staleinstances(self):
for key, value in list(self.instance_list.items()):

View File

@ -5,17 +5,26 @@ class History():
def __init__(self):
self.client_history = list()
self.instance_history = list()
self.server_history = list()
def add_client_history(self, client_num):
if len(self.client_history) > 1440:
if len(self.client_history) > 2880:
self.client_history = self.client_history[1:]
self.client_history.append({
'count' : client_num,
'time' : int(time.time())
})
def add_server_history(self, server_num):
if len(self.server_history) > 2880:
self.server_history = self.server_history[1:]
self.server_history.append({
'count' : server_num,
'time' : int(time.time())
})
def add_instance_history(self, instance_num):
if len(self.instance_history) > 1440:
if len(self.instance_history) > 2880:
self.instance_history = self.instance_history[1:]
self.instance_history.append({
'count' : instance_num,

View File

@ -35,13 +35,15 @@ class HistoryGraph(Resource):
instance_counts = [history['count'] for history in ctx.history.instance_history][-history_count:]
client_counts = [history['count'] for history in ctx.history.client_history][-history_count:]
server_counts = [history['count'] for history in ctx.history.server_history][-history_count:]
graph.add('Client Count', client_counts)
graph.add('Instance Count', instance_counts)
return { 'message' : graph.render().replace("<title>Pygal</title>", ""),
'data_points' : len(instance_count),
'instance_count' : 0 if len(instance_counts) is 0 else instance_counts[-1],
'client_count' : 0 if len(client_counts) is 0 else client_counts[-1]
'client_count' : 0 if len(client_counts) is 0 else client_counts[-1],
'server_count' : 0 if len(server_counts) is 0 else server_counts[-1]
}, 200
except Exception as e:
return { 'message' : str(e) }, 500

View File

@ -12,6 +12,7 @@
<figcaption class="float-left">
<span class="h4 text-muted">{{instance_count}} instances</span>
<span class="h4 text-muted">&mdash; {{client_count}} clients</span>
<span class="h4 text-muted">&mdash; {{server_count}} servers</span>
</figcaption>
</figure>
@ -26,7 +27,7 @@
<script type="text/javascript" src="http://kozea.github.com/pygal.js/latest/pygal-tooltips.min.js"></script>
<script>
let dataPoints = {{data_points}};
let maxPoints = {{ max_data_points }};
let maxPoints = 2880;
maxPoints = Math.min(maxPoints, dataPoints);
let zoomLevel = Math.floor(maxPoints);
let performingZoom = false;

View File

@ -9,7 +9,7 @@ from master.resources.history_graph import HistoryGraph
@app.route('/')
def home():
_history_graph = HistoryGraph().get(500)
_history_graph = HistoryGraph().get(2880)
return render_template(
'index.html',
title='API Overview',
@ -17,5 +17,5 @@ def home():
data_points = _history_graph[0]['data_points'],
instance_count = _history_graph[0]['instance_count'],
client_count = _history_graph[0]['client_count'],
max_data_points = 1440
server_count = _history_graph[0]['server_count']
)

View File

@ -278,9 +278,15 @@ namespace IW4MAdmin.Plugins.Stats
return String.Join(Environment.NewLine, Commands.TopStats.GetTopStats(s).Result);
}
string mostPlayed(Server s)
{
return String.Join(Environment.NewLine, Commands.MostPlayed.GetMostPlayed(s).Result);
}
manager.GetMessageTokens().Add(new MessageToken("TOTALKILLS", totalKills));
manager.GetMessageTokens().Add(new MessageToken("TOTALPLAYTIME", totalPlayTime));
manager.GetMessageTokens().Add(new MessageToken("TOPSTATS", topStats));
manager.GetMessageTokens().Add(new MessageToken("MOSTPLAYED", mostPlayed));
ServerManager = manager;

View File

@ -245,7 +245,7 @@ namespace SharedLibraryCore.RCon
goto retrySend;
else if (FailedReceives == 4)
{
Log.WriteError($"Failed to receive data from {socketConnection.RemoteEndPoint} after {FailedReceives} tries");
// Log.WriteError($"Failed to receive data from {socketConnection.RemoteEndPoint} after {FailedReceives} tries");
}
if (FailedReceives >= 4)
@ -277,7 +277,7 @@ namespace SharedLibraryCore.RCon
else if (FailedReceives == 4)
{
Log.WriteError($"Failed to receive data from {socketConnection.RemoteEndPoint} after {FailedReceives} tries");
// Log.WriteError($"Failed to receive data from {socketConnection.RemoteEndPoint} after {FailedReceives} tries");
}
if (FailedReceives >= 4)

View File

@ -168,7 +168,7 @@ namespace SharedLibraryCore.Services
.ToListAsync();
// update all related clients level
matchingClients.ForEach(c => c.Level = (client.Level == Objects.Player.Permission.Banned) ?
matchingClients.ForEach(c => c.Level = (client.Level == Player.Permission.Banned) ?
client.Level : entity.Level);
}

View File

@ -5,8 +5,22 @@
init()
{
SetDvarIfUninitialized("sv_customcallbacks", true);
SetDvarIfUninitialized("sv_framewaittime", 0.05);
SetDvarIfUninitialized("sv_additionalwaittime", 0.05);
SetDvarIfUninitialized("sv_maxstoredframes", 3);
level thread onPlayerConnect();
level waittill("prematch_over");
level.callbackPlayerKilled = ::Callback_PlayerKilled;
level.callbackPlayerDamage = ::Callback_PlayerDamage;
}
onPlayerConnect(player)
{
for(;;)
{
level waittill( "connected", player );
player thread waitForFrameThread();
}
}
hitLocationToBone(hitloc)
@ -52,15 +66,52 @@ hitLocationToBone(hitloc)
}
}
VectorScale(vector)
waitForFrameThread()
{
vector[0] = vector[0]*100000;
vector[1] = vector[1]*100000;
vector[2] = vector[2]*100000;
return vector;
self endon("disconnect");
self.currentAnglePosition = 0;
self.anglePositions = [];
for(;;)
{
self.anglePositions[self.currentAnglePosition] = self getPlayerAngles();
wait(getDvarFloat("sv_framewaittime"));
self.currentAnglePosition = (self.currentAnglePosition + 1) % getDvarInt("sv_maxstoredframes");
}
}
Callback_PlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration )
waitForAdditionalAngles(logString)
{
wait(getDvarFloat("sv_additionalwaittime"));
self.angleSnapshot = [];
for(i = 0; i < getDvarInt("sv_maxstoredframes"); i++)
{
self.angleSnapshot[i] = self.anglePositions[i];
}
currentPos = self.currentAnglePosition;
anglesStr = "";
i = 0;
if (currentPos < getDvarInt("sv_maxstoredframes") - 1)
{
i = currentPos + 1;
}
while(i != currentPos)
{
anglesStr += self.angleSnapshot[i] + ":";
i = (i + 1) % getDvarInt("sv_maxstoredframes");
}
logPrint(logString + ";" + anglesStr + "\n");
}
Process_Hit(type, attacker, sHitLoc, sMeansOfDeath, iDamage, sWeapon)
{
victim = self;
_attacker = attacker;
@ -69,11 +120,27 @@ Callback_PlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vD
else if(!isPlayer(attacker) && sMeansOfDeath == "MOD_FALLING")
_attacker = victim;
location = victim GetTagOrigin(hitLocationToBone(sHitLoc));
isKillstreakKill = !isPlayer(attacker) || isKillstreakWeapon(sWeapon);
/*BulletTrace(_attacker GetTagOrigin("tag_eye"), VectorScale(anglesToForward(attacker getPlayerAngles())), true, attacker)["entity"]*/
logPrint("ScriptKill;" + _attacker.guid + ";" + victim.guid + ";" + _attacker GetTagOrigin("tag_eye") + ";" + location + ";" + iDamage + ";" + sWeapon + ";" + sHitLoc + ";" + sMeansOfDeath + ";" + _attacker getPlayerAngles() + ";" + gettime() + ";" + isKillstreakKill + ";" + _attacker playerADS() + "\n");
logLine = "Script" + type + ";" + _attacker.guid + ";" + victim.guid + ";" + _attacker GetTagOrigin("tag_eye") + ";" + location + ";" + iDamage + ";" + sWeapon + ";" + sHitLoc + ";" + sMeansOfDeath + ";" + _attacker getPlayerAngles() + ";" + gettime() + ";" + isKillstreakKill + ";" + _attacker playerADS();
attacker thread waitForAdditionalAngles(logLine);
}
Callback_PlayerDamage( eInflictor, attacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime )
{
if (level.teamBased && isDefined( attacker ) && ( self != attacker ) && isDefined( attacker.team ) && ( self.pers[ "team" ] == attacker.team ))
return;
if (self.health - iDamage > 0)
{
self Process_Hit("Damage", attacker, sHitLoc, sMeansOfDeath, iDamage, sWeapon);
}
self maps\mp\gametypes\_damage::Callback_PlayerDamage(eInflictor, attacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime );
}
Callback_PlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration )
{
Process_Hit("Kill", attacker, sHitLoc, sMeansOfDeath, iDamage, sWeapon);
self maps\mp\gametypes\_damage::Callback_PlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration );
}

View File

@ -8,11 +8,11 @@ CHANGELOG:
-added unflag command to more intuitively unflag a client
-added multi-line tokens: {{TOPSTATS}} {{MOSTPLAYED}}
-able to view linked accounts on webfront via dropdown (privileged only)
-multiple privileged accouns are consolidated in the admin list
-multiple privileged accounts are consolidated in the admin list
-Added IW5m/Pluto IW5, T5m/V2, CoD4, and WaW support
-changed event system to use a better pipeline
-IW4x anti-cheat further refined
-kick and temban required privileges adjusted
-kick and tempban required privileges adjusted
-fixed issues with RCon responding improperly
-improved IW4x frequency of IW4x servers going offline
-profanity plugin now kicks players with offensive names (if enabled)