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

@ -1,4 +1,4 @@
 { {
"LocalizationName": "en-US", "LocalizationName": "en-US",
"LocalizationIndex": { "LocalizationIndex": {
"Set": { "Set": {
@ -66,9 +66,9 @@
"COMMANDS_OWNER_SUCCESS": "Congratulations, you have claimed ownership of this server!", "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_FAIL": "Your password must be at least 5 characters long",
"COMMANDS_PASSWORD_SUCCESS": "Your password has been set successfully", "COMMANDS_PASSWORD_SUCCESS": "Your password has been set successfully",
"COMMANDS_PING_DESC": "get client's ping", "COMMANDS_PING_DESC": "get client's latency",
"COMMANDS_PING_SELF": "Your ping is", "COMMANDS_PING_SELF": "Your latency is",
"COMMANDS_PING_TARGET": "ping is", "COMMANDS_PING_TARGET": "latency is",
"COMMANDS_PLUGINS_DESC": "view all loaded plugins", "COMMANDS_PLUGINS_DESC": "view all loaded plugins",
"COMMANDS_PLUGINS_LOADED": "Loaded Plugins", "COMMANDS_PLUGINS_LOADED": "Loaded Plugins",
"COMMANDS_PM_DESC": "send message to other client", "COMMANDS_PM_DESC": "send message to other client",
@ -116,7 +116,6 @@
"COMMANDS_WHO_DESC": "give information about yourself", "COMMANDS_WHO_DESC": "give information about yourself",
"GLOBAL_DAYS": "days", "GLOBAL_DAYS": "days",
"GLOBAL_ERROR": "Error", "GLOBAL_ERROR": "Error",
"GLOBAL_DEBUG": "Debug",
"GLOBAL_HOURS": "hours", "GLOBAL_HOURS": "hours",
"GLOBAL_INFO": "Info", "GLOBAL_INFO": "Info",
"GLOBAL_MINUTES": "minutes", "GLOBAL_MINUTES": "minutes",
@ -242,7 +241,7 @@
"WEBFRONT_PROFILE_LEVEL": "Level", "WEBFRONT_PROFILE_LEVEL": "Level",
"WEBFRONT_PROFILE_LSEEN": "Last seen", "WEBFRONT_PROFILE_LSEEN": "Last seen",
"WEBFRONT_PROFILE_PLAYER": "Played", "WEBFRONT_PROFILE_PLAYER": "Played",
"PLUGIN_STATS_SETUP_ENABLEAC ": "Enable server-side anti-cheat (IW4 only)", "PLUGIN_STATS_SETUP_ENABLEAC": "Enable server-side anti-cheat (IW4 only)",
"PLUGIN_STATS_ERROR_ADD": "Could not add server to server stats", "PLUGIN_STATS_ERROR_ADD": "Could not add server to server stats",
"PLUGIN_STATS_CHEAT_DETECTED": "You appear to be cheating", "PLUGIN_STATS_CHEAT_DETECTED": "You appear to be cheating",
"PLUGINS_STATS_TEXT_KDR": "KDR", "PLUGINS_STATS_TEXT_KDR": "KDR",
@ -253,7 +252,18 @@
"PLUGINS_LOGIN_AUTH": "not logged in", "PLUGINS_LOGIN_AUTH": "not logged in",
"PLUGINS_PROFANITY_SETUP_ENABLE": "Enable profanity deterring", "PLUGINS_PROFANITY_SETUP_ENABLE": "Enable profanity deterring",
"PLUGINS_PROFANITY_WARNMSG": "Please do not use profanity on this server", "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

@ -1,4 +1,4 @@
 { {
"LocalizationName": "es-EC", "LocalizationName": "es-EC",
"LocalizationIndex": { "LocalizationIndex": {
"Set": { "Set": {
@ -241,7 +241,7 @@
"WEBFRONT_PROFILE_LEVEL": "Nivel", "WEBFRONT_PROFILE_LEVEL": "Nivel",
"WEBFRONT_PROFILE_LSEEN": "Última vez visto hace", "WEBFRONT_PROFILE_LSEEN": "Última vez visto hace",
"WEBFRONT_PROFILE_PLAYER": "Jugadas", "WEBFRONT_PROFILE_PLAYER": "Jugadas",
"PLUGIN_STATS_SETUP_ENABLEAC ": "Habilitar anti-trampas junto al servidor (solo IW4)", "PLUGIN_STATS_SETUP_ENABLEAC": "Habilitar anti-trampas junto al servidor (solo IW4)",
"PLUGIN_STATS_ERROR_ADD": "No se puedo añadir servidor a los estados del servidor", "PLUGIN_STATS_ERROR_ADD": "No se puedo añadir servidor a los estados del servidor",
"PLUGIN_STATS_CHEAT_DETECTED": "Pareces estar haciendo trampa", "PLUGIN_STATS_CHEAT_DETECTED": "Pareces estar haciendo trampa",
"PLUGINS_STATS_TEXT_KDR": "KDR", "PLUGINS_STATS_TEXT_KDR": "KDR",
@ -252,7 +252,18 @@
"PLUGINS_LOGIN_AUTH": "No registrado", "PLUGINS_LOGIN_AUTH": "No registrado",
"PLUGINS_PROFANITY_SETUP_ENABLE": "Habilitar la disuasión de blasfemias", "PLUGINS_PROFANITY_SETUP_ENABLE": "Habilitar la disuasión de blasfemias",
"PLUGINS_PROFANITY_WARNMSG": "Por favor no uses blasfemias en este servidor", "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

@ -1,4 +1,4 @@
 { {
"LocalizationName": "pt-BR", "LocalizationName": "pt-BR",
"LocalizationIndex": { "LocalizationIndex": {
"Set": { "Set": {
@ -82,7 +82,7 @@
"COMMANDS_REPORT_FAIL": "Você não pode reportar", "COMMANDS_REPORT_FAIL": "Você não pode reportar",
"COMMANDS_REPORT_FAIL_CAMP": "Você não pode denunciar o jogador por camperar", "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_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_REPORT_SUCCESS": "Obrigado pela sua denúncia, um administrador foi notificado",
"COMMANDS_REPORTS_CLEAR_SUCCESS": "Lista de denúncias limpa com sucesso", "COMMANDS_REPORTS_CLEAR_SUCCESS": "Lista de denúncias limpa com sucesso",
"COMMANDS_REPORTS_DESC": "obtém ou limpa as denúncias recentes", "COMMANDS_REPORTS_DESC": "obtém ou limpa as denúncias recentes",
@ -109,7 +109,7 @@
"COMMANDS_UPTIME_TEXT": "está online por", "COMMANDS_UPTIME_TEXT": "está online por",
"COMMANDS_USAGE_DESC": "vê quanto o aplicativo está usando de memória RAM do seu computador", "COMMANDS_USAGE_DESC": "vê quanto o aplicativo está usando de memória RAM do seu computador",
"COMMANDS_USAGE_TEXT": "está usando", "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_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_DESC": "remove todos os avisos para um cliente",
"COMMANDS_WARNCLEAR_SUCCESS": "Todos as advertências foram apagados para", "COMMANDS_WARNCLEAR_SUCCESS": "Todos as advertências foram apagados para",
@ -241,7 +241,7 @@
"WEBFRONT_PROFILE_LEVEL": "Nível", "WEBFRONT_PROFILE_LEVEL": "Nível",
"WEBFRONT_PROFILE_LSEEN": "Visto por último em", "WEBFRONT_PROFILE_LSEEN": "Visto por último em",
"WEBFRONT_PROFILE_PLAYER": "Jogou", "WEBFRONT_PROFILE_PLAYER": "Jogou",
"PLUGIN_STATS_SETUP_ENABLEAC ": "Habilitar a anti-trapaça no servidor (Somente IW4/MW2)", "PLUGIN_STATS_SETUP_ENABLEAC": "Habilitar a anti-trapaça no servidor (Somente IW4/MW2)",
"PLUGIN_STATS_ERROR_ADD": "Não foi possível adicionar o servidor para as estatísticas do servidor", "PLUGIN_STATS_ERROR_ADD": "Não foi possível adicionar o servidor para as estatísticas do servidor",
"PLUGIN_STATS_CHEAT_DETECTED": "Aparentemente você está trapaceando", "PLUGIN_STATS_CHEAT_DETECTED": "Aparentemente você está trapaceando",
"PLUGINS_STATS_TEXT_KDR": "KDR", "PLUGINS_STATS_TEXT_KDR": "KDR",
@ -252,7 +252,18 @@
"PLUGINS_LOGIN_AUTH": "não está registrado", "PLUGINS_LOGIN_AUTH": "não está registrado",
"PLUGINS_PROFANITY_SETUP_ENABLE": "Habilitar o plugin de anti-palavrão", "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_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_OFFLINE": "^5IW4MAdmin ^1ВЫКЛЮЧАЕТСЯ",
"BROADCAST_ONLINE": "^5IW4MADMIN ^7сейчас В СЕТИ", "BROADCAST_ONLINE": "^5IW4MADMIN ^7сейчас В СЕТИ",
"COMMAND_HELP_OPTIONAL": "опционально", "COMMAND_HELP_OPTIONAL": "опционально",
"COMMAND_HELP_SYNTAX": "синтаксис:", "COMMAND_HELP_SYNTAX": "Проблема с выражением мысли ( пересмотри слова)",
"COMMAND_MISSINGARGS": "Приведено недостаточно аргументов", "COMMAND_MISSINGARGS": "Приведено недостаточно аргументов",
"COMMAND_NOACCESS": "У вас нет доступа к этой команде", "COMMAND_NOACCESS": "У вас нет доступа к этой команде",
"COMMAND_NOTAUTHORIZED": "Вы не авторизованы для исполнения этой команды", "COMMAND_NOTAUTHORIZED": "Вы не авторизованы для исполнения этой команды",
@ -42,8 +42,8 @@
"COMMANDS_FIND_MIN": "Пожалуйста, введите хотя бы 3 символа", "COMMANDS_FIND_MIN": "Пожалуйста, введите хотя бы 3 символа",
"COMMANDS_FLAG_DESC": "отметить подозрительного игрока и сообщить администраторам, чтобы присоединились", "COMMANDS_FLAG_DESC": "отметить подозрительного игрока и сообщить администраторам, чтобы присоединились",
"COMMANDS_FLAG_FAIL": "Вы не можете ставить отметки", "COMMANDS_FLAG_FAIL": "Вы не можете ставить отметки",
"COMMANDS_FLAG_SUCCESS": "Вы были отмечены", "COMMANDS_FLAG_SUCCESS": "Вы отметили",
"COMMANDS_FLAG_UNFLAG": "С вас сняли отметку", "COMMANDS_FLAG_UNFLAG": "Вы сняли отметку",
"COMMANDS_HELP_DESC": "перечислить все доступные команды", "COMMANDS_HELP_DESC": "перечислить все доступные команды",
"COMMANDS_HELP_MOREINFO": "Введите !help <имя команды>, чтобы узнать синтаксис для использования команды", "COMMANDS_HELP_MOREINFO": "Введите !help <имя команды>, чтобы узнать синтаксис для использования команды",
"COMMANDS_HELP_NOTFOUND": "Не удалось найти эту команду", "COMMANDS_HELP_NOTFOUND": "Не удалось найти эту команду",
@ -207,7 +207,7 @@
"WEBFRONT_CLIENT_META_FALSE": "не", "WEBFRONT_CLIENT_META_FALSE": "не",
"WEBFRONT_CLIENT_META_JOINED": "Присоединился с именем", "WEBFRONT_CLIENT_META_JOINED": "Присоединился с именем",
"WEBFRONT_CLIENT_META_MASKED": "Замаскирован", "WEBFRONT_CLIENT_META_MASKED": "Замаскирован",
"WEBFRONT_CLIENT_META_TRUE": "", "WEBFRONT_CLIENT_META_TRUE": "Это",
"WEBFRONT_CLIENT_PRIVILEGED_TITLE": "Игроки с правами", "WEBFRONT_CLIENT_PRIVILEGED_TITLE": "Игроки с правами",
"WEBFRONT_CLIENT_PROFILE_TITLE": "Профиль", "WEBFRONT_CLIENT_PROFILE_TITLE": "Профиль",
"WEBFRONT_CLIENT_SEARCH_MATCHING": "Подходящие игроки", "WEBFRONT_CLIENT_SEARCH_MATCHING": "Подходящие игроки",
@ -219,8 +219,8 @@
"WEBFRONT_ERROR_TITLE": "Ошибка!", "WEBFRONT_ERROR_TITLE": "Ошибка!",
"WEBFRONT_HOME_TITLE": "Обзор сервера", "WEBFRONT_HOME_TITLE": "Обзор сервера",
"WEBFRONT_NAV_CONSOLE": "Консоль", "WEBFRONT_NAV_CONSOLE": "Консоль",
"WEBFRONT_NAV_DISCORD": "Discord", "WEBFRONT_NAV_DISCORD": "Дискорд ",
"WEBFRONT_NAV_HOME": "Домой", "WEBFRONT_NAV_HOME": "Обзор Серверов ",
"WEBFRONT_NAV_LOGOUT": "Выйти", "WEBFRONT_NAV_LOGOUT": "Выйти",
"WEBFRONT_NAV_PENALTIES": "Наказания", "WEBFRONT_NAV_PENALTIES": "Наказания",
"WEBFRONT_NAV_PRIVILEGED": "Админы", "WEBFRONT_NAV_PRIVILEGED": "Админы",
@ -241,18 +241,29 @@
"WEBFRONT_PROFILE_LEVEL": "Уровень", "WEBFRONT_PROFILE_LEVEL": "Уровень",
"WEBFRONT_PROFILE_LSEEN": "Последний раз заходил", "WEBFRONT_PROFILE_LSEEN": "Последний раз заходил",
"WEBFRONT_PROFILE_PLAYER": "Наиграл", "WEBFRONT_PROFILE_PLAYER": "Наиграл",
"PLUGIN_STATS_SETUP_ENABLEAC ": "Включить серверный античит (только IW4)", "PLUGIN_STATS_SETUP_ENABLEAC": "Включить серверный античит (только IW4)",
"PLUGIN_STATS_ERROR_ADD": "Не удалось добавить сервер в статистику серверов", "PLUGIN_STATS_ERROR_ADD": "Не удалось добавить сервер в статистику серверов",
"PLUGIN_STATS_CHEAT_DETECTED": "Кажется, вы читерите", "PLUGIN_STATS_CHEAT_DETECTED": "Кажется, вы читерите",
"PLUGINS_STATS_TEXT_KDR": "Соотношение У/C", "PLUGINS_STATS_TEXT_KDR": "Вот так ..",
"PLUGINS_STATS_META_SPM": "Счёт за минуту", "PLUGINS_STATS_META_SPM": "Счёт за минуту",
"PLUGINS_WELCOME_USERANNOUNCE": "^5{{ClientName}} ^7из ^5{{ClientLocation}}", "PLUGINS_WELCOME_USERANNOUNCE": "^5{{ClientName}} ^7из ^5{{ClientLocation}}",
"PLUGINS_WELCOME_USERWELCOME": "Добро пожаловать, ^5{{ClientName}}^7. Это ваше ^5{{TimesConnected}} ^7подключение по счёту!", "PLUGINS_WELCOME_USERWELCOME": "Добро пожаловать, ^5{{ClientName}}^7. Это ваше ^5{{TimesConnected}} ^7подключение по счёту!",
"PLUGINS_WELCOME_PRIVANNOUNCE": "{{ClientLevel}} {{ClientName}} присоединился к серверу", "PLUGINS_WELCOME_PRIVANNOUNCE": "{{ClientLevel}} {{ClientName}} присоединился к серверу",
"PLUGINS_LOGIN_AUTH": "не вошёл", "PLUGINS_LOGIN_AUTH": "Сперва Подключись",
"PLUGINS_PROFANITY_SETUP_ENABLE": "Включить сдерживание ненормативной лексики", "PLUGINS_PROFANITY_SETUP_ENABLE": "Включить сдерживание ненормативной лексики",
"PLUGINS_PROFANITY_WARNMSG": "Пожалуйта, не ругайтесь на этом сервере", "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 client_num += server.clientnum
self.history.add_client_history(client_num) self.history.add_client_history(client_num)
self.history.add_instance_history(len(self.instance_list)) self.history.add_instance_history(len(self.instance_list))
self.history.add_server_history(len(servers))
def _remove_staleinstances(self): def _remove_staleinstances(self):
for key, value in list(self.instance_list.items()): for key, value in list(self.instance_list.items()):

View File

@ -5,17 +5,26 @@ class History():
def __init__(self): def __init__(self):
self.client_history = list() self.client_history = list()
self.instance_history = list() self.instance_history = list()
self.server_history = list()
def add_client_history(self, client_num): 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 = self.client_history[1:]
self.client_history.append({ self.client_history.append({
'count' : client_num, 'count' : client_num,
'time' : int(time.time()) '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): 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 = self.instance_history[1:]
self.instance_history.append({ self.instance_history.append({
'count' : instance_num, '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:] 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:] 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('Client Count', client_counts)
graph.add('Instance Count', instance_counts) graph.add('Instance Count', instance_counts)
return { 'message' : graph.render().replace("<title>Pygal</title>", ""), return { 'message' : graph.render().replace("<title>Pygal</title>", ""),
'data_points' : len(instance_count), 'data_points' : len(instance_count),
'instance_count' : 0 if len(instance_counts) is 0 else instance_counts[-1], '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 }, 200
except Exception as e: except Exception as e:
return { 'message' : str(e) }, 500 return { 'message' : str(e) }, 500

View File

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

View File

@ -9,7 +9,7 @@ from master.resources.history_graph import HistoryGraph
@app.route('/') @app.route('/')
def home(): def home():
_history_graph = HistoryGraph().get(500) _history_graph = HistoryGraph().get(2880)
return render_template( return render_template(
'index.html', 'index.html',
title='API Overview', title='API Overview',
@ -17,5 +17,5 @@ def home():
data_points = _history_graph[0]['data_points'], data_points = _history_graph[0]['data_points'],
instance_count = _history_graph[0]['instance_count'], instance_count = _history_graph[0]['instance_count'],
client_count = _history_graph[0]['client_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); 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("TOTALKILLS", totalKills));
manager.GetMessageTokens().Add(new MessageToken("TOTALPLAYTIME", totalPlayTime)); manager.GetMessageTokens().Add(new MessageToken("TOTALPLAYTIME", totalPlayTime));
manager.GetMessageTokens().Add(new MessageToken("TOPSTATS", topStats)); manager.GetMessageTokens().Add(new MessageToken("TOPSTATS", topStats));
manager.GetMessageTokens().Add(new MessageToken("MOSTPLAYED", mostPlayed));
ServerManager = manager; ServerManager = manager;

View File

@ -245,7 +245,7 @@ namespace SharedLibraryCore.RCon
goto retrySend; goto retrySend;
else if (FailedReceives == 4) 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) if (FailedReceives >= 4)
@ -277,7 +277,7 @@ namespace SharedLibraryCore.RCon
else if (FailedReceives == 4) 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) if (FailedReceives >= 4)

View File

@ -168,7 +168,7 @@ namespace SharedLibraryCore.Services
.ToListAsync(); .ToListAsync();
// update all related clients level // 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); client.Level : entity.Level);
} }

View File

@ -5,8 +5,22 @@
init() init()
{ {
SetDvarIfUninitialized("sv_customcallbacks", true); 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 waittill("prematch_over");
level.callbackPlayerKilled = ::Callback_PlayerKilled; level.callbackPlayerKilled = ::Callback_PlayerKilled;
level.callbackPlayerDamage = ::Callback_PlayerDamage;
}
onPlayerConnect(player)
{
for(;;)
{
level waittill( "connected", player );
player thread waitForFrameThread();
}
} }
hitLocationToBone(hitloc) hitLocationToBone(hitloc)
@ -52,15 +66,52 @@ hitLocationToBone(hitloc)
} }
} }
VectorScale(vector) waitForFrameThread()
{ {
vector[0] = vector[0]*100000; self endon("disconnect");
vector[1] = vector[1]*100000;
vector[2] = vector[2]*100000; self.currentAnglePosition = 0;
return vector; 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; victim = self;
_attacker = attacker; _attacker = attacker;
@ -69,11 +120,27 @@ Callback_PlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vD
else if(!isPlayer(attacker) && sMeansOfDeath == "MOD_FALLING") else if(!isPlayer(attacker) && sMeansOfDeath == "MOD_FALLING")
_attacker = victim; _attacker = victim;
location = victim GetTagOrigin(hitLocationToBone(sHitLoc)); location = victim GetTagOrigin(hitLocationToBone(sHitLoc));
isKillstreakKill = !isPlayer(attacker) || isKillstreakWeapon(sWeapon); isKillstreakKill = !isPlayer(attacker) || isKillstreakWeapon(sWeapon);
/*BulletTrace(_attacker GetTagOrigin("tag_eye"), VectorScale(anglesToForward(attacker getPlayerAngles())), true, attacker)["entity"]*/ logLine = "Script" + type + ";" + _attacker.guid + ";" + victim.guid + ";" + _attacker GetTagOrigin("tag_eye") + ";" + location + ";" + iDamage + ";" + sWeapon + ";" + sHitLoc + ";" + sMeansOfDeath + ";" + _attacker getPlayerAngles() + ";" + gettime() + ";" + isKillstreakKill + ";" + _attacker playerADS();
logPrint("ScriptKill;" + _attacker.guid + ";" + victim.guid + ";" + _attacker GetTagOrigin("tag_eye") + ";" + location + ";" + iDamage + ";" + sWeapon + ";" + sHitLoc + ";" + sMeansOfDeath + ";" + _attacker getPlayerAngles() + ";" + gettime() + ";" + isKillstreakKill + ";" + _attacker playerADS() + "\n"); 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 ); 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 unflag command to more intuitively unflag a client
-added multi-line tokens: {{TOPSTATS}} {{MOSTPLAYED}} -added multi-line tokens: {{TOPSTATS}} {{MOSTPLAYED}}
-able to view linked accounts on webfront via dropdown (privileged only) -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 -Added IW5m/Pluto IW5, T5m/V2, CoD4, and WaW support
-changed event system to use a better pipeline -changed event system to use a better pipeline
-IW4x anti-cheat further refined -IW4x anti-cheat further refined
-kick and temban required privileges adjusted -kick and tempban required privileges adjusted
-fixed issues with RCon responding improperly -fixed issues with RCon responding improperly
-improved IW4x frequency of IW4x servers going offline -improved IW4x frequency of IW4x servers going offline
-profanity plugin now kicks players with offensive names (if enabled) -profanity plugin now kicks players with offensive names (if enabled)