Скрипт для получения информации о игроках Minecraft 1.7.10 — WorldGuard, Essentials, PermissionsEx, iConomy
Для администраторов Minecraft серверов на версии 1.7.10 был разработан удобный и мощный скрипт, который позволяет получить полную информацию о любом игроке, включая данные из плагинов WorldGuard, Essentials, PermissionsEx и iConomy (MySQL). Чтобы использовать скрипт, выполните следующие шаги: Предположим, вы хотите получить полную информацию о игроке с именем Для корректной работы скрипта необходимо: Теперь вы можете легко собирать информацию о любых игроках на вашем сервере Minecraft, используя данный скрипт. Убедитесь, что у вас настроены все пути и параметры, и следите за активностью игроков!
Скрипт для получения полной информации об игроке Minecraft 1.7.10
Основные возможности скрипта:
Как использовать:
worldguard, permissions.yml, userdata и настройки MySQL.python3 userinfo.py ИмяИгрока
userinfo.txt, который можно открыть для просмотра.Пример вывода:
Информация о игроке: Игрок123
Дата запроса: 2026-03-04 15:23:12
----------------------------------------------------------------------
Группы / привилегии:
• admin
• moderator
Баланс (iConomy): 2500.00 Rub
Essentials userdаta:
UUID : 1234xxxd-xxx-efgh-9101-ijklmnopqrst
Никнейм : Игрок123
IP (последний) : 95.89.100.100
AFK : нет
GodMode : ✅ да
В тюрьме : нет
Последний вход : 2026-03-04 14:50:12
Последний выход : 2026-03-04 15:20:01
Последний телепорт : 2026-03-04 14:55:10
Примерно первый вход: 2026-03-01 12:00:00 (по киту)
Домов : 2
• Дом1 → world 100.0 64.0 200.0
• Дом2 → world 150.0 65.0 250.0
Последняя позиция:
world x:110.0 y:64.0 z:200.0
Позиция выхода:
world x:120.0 y:63.0 z:210.0
Приваты WorldGuard (3 шт):
• Регион1 → владелец
Координаты: 50,50,50 → 100,100,100
Флаги: build=true, pvp=false
• Регион2 → участник
Координаты: 200,64,200 → 250,70,250
Флаги: —
• Регион3 → владелец
Координаты: 300,64,300 → 350,70,350
Флаги: block-place=false
Пример использования:
Игрок123:
python3 userinfo.py Игрок123
userinfo.txt, который будет содержать такую информацию, как:
Что необходимо для работы скрипта:
pip install pyyaml mysql-connector-python.worldguard, permissions.yml, userdata.Код скрипта:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
import os
import yaml
from datetime import datetime
import mysql.connector
from mysql.connector import Error
# ===================== НАСТРОЙКИ =====================
SERVER_PATH = "/ПУТЬ_К_КОРНЕВОЙ_ПАПКЕ_СЕРВЕРА/"
WG_REGIONS_FILE = os.path.join(SERVER_PATH, "plugins/WorldGuard/worlds/world/regions.yml")
PEX_FILE = os.path.join(SERVER_PATH, "plugins/PermissionsEx/permissions.yml")
ESSENTIALS_USERDATA = os.path.join(SERVER_PATH, "plugins/Essentials/userdata")
# iConomy MySQL — ОБЯЗАТЕЛЬНО ИЗМЕНИТЕ!
DB_CONFIG = {
'host': 'localhost',
'port': 3306,
'database': 'ИМЯ_БВ',
'user': 'ПОЛЬЗОВАТЕЛЬ_БД',
'password': 'ПАРОЛЬ_БД',
'table': 'iConomy'
}
OUTPUT_FILE = "/ПУТЬ_К_ФАЙЛУ_С_РЕЗУЛЬТАТОМ/userinfo.txt"
# =====================================================
def load_yaml(file_path):
if not os.path.exists(file_path):
return None
try:
with open(file_path, 'r', encoding='utf-8') as f:
return yaml.safe_load(f)
except Exception:
return None
def find_player_regions(player_lower, regions_data):
if not regions_data or 'regions' not in regions_dаta:
return []
found = []
for reg_name, data in regions_data['regions'].items():
if reg_name in ('__global__', '_phx_'):
continue
owners = [p.lower() for p in data.get('owners', {}).get('players', [])]
members = [p.lower() for p in data.get('members', {}).get('players', [])]
if player_lower in owners:
role = "владелец"
elif player_lower in members:
role = "участник"
else:
continue
minc = data.get('min', {})
maxc = data.get('max', {})
flags = data.get('flags', {})
found.append({
'region': reg_name,
'role': role,
'min': f"{minc.get('x','?')},{minc.get('y','?')},{minc.get('z','?')}",
'max': f"{maxc.get('x','?')},{maxc.get('y','?')},{maxc.get('z','?')}",
'flags': ", ".join(f"{k}={v}" for k,v in flags.items()) if flags else "—"
})
return found
def get_essentials_info(player_name):
player_lower = player_name.lower()
for filename in os.listdir(ESSENTIALS_USERDATA):
if not filename.endswith('.yml'):
continue
path = os.path.join(ESSENTIALS_USERDATA, filename)
data = load_yaml(path)
if not dаta:
continue
if str(data.get('lastAccountName', '')).lower() == player_lower:
ts = data.get('timestamps', {}) or {}
kits = ts.get('kits', {}) or {}
first_ts = min(kits.values()) if kits else None
return {
'uuid': filename.replace('.yml', ''),
'nickname': data.get('lastAccountName', '—'),
'ip': data.get('ipAddress', '—'),
'lastlogin': ts.get('login'),
'logout': ts.get('logout'),
'lastteleport': ts.get('lastteleport'),
'first_approx': first_ts,
'afk': data.get('afk', False),
'godmode': data.get('godmode', False),
'jailed': data.get('jailed', False),
'homes': data.get('homes', {}),
'lastlocation': data.get('lastlocation', {}),
'logoutlocation': data.get('logoutlocation', {})
}
return None
def get_player_groups(player_lower, pex_data):
if not pex_data or 'users' not in pex_dаta:
return ["не найдено"]
for user_data in pex_data['users'].values():
name = str(user_data.get('options', {}).get('name', '')).lower()
if name == player_lower:
groups = user_data.get('group', [])
if isinstance(groups, str):
groups = [groups]
return groups if groups else ["default"]
return ["не найден в permissions.yml"]
def get_iconomy_balance(player_name):
try:
conn = mysql.connector.connect(**{k: v for k, v in DB_CONFIG.items() if k != 'table'})
cursor = conn.cursor(dictionary=True)
cursor.execute(f"SELECT balance FROM {DB_CONFIG['table']} WHERE username = %s", (player_name,))
row = cursor.fetchone()
return round(float(row['balance']), 2) if row else 0.00
except Exception:
return "ошибка подключения"
finally:
if 'conn' in locals() and conn.is_connected():
conn.close()
def format_ts(ts):
if not ts:
return "—"
try:
return datetime.fromtimestamp(ts / 1000).strftime('%Y-%m-%d %H:%M:%S')
except:
return str(ts)
def safe_coord(coord_dict, key):
val = coord_dict.get(key)
if val is None:
return "—"
try:
return f"{float(val):.1f}"
except (ValueError, TypeError):
return "—"
def main():
if len(sys.argv) < 2:
print("Использование: python3 userinfo.py ИмяИгрока")
sys.exit(1)
player = sys.argv[1].strip()
player_lower = player.lower()
print(f"🔍 Собираем информацию о игроке: {player}")
wg_data = load_yaml(WG_REGIONS_FILE)
regions = find_player_regions(player_lower, wg_data)
ess = get_essentials_info(player)
pex_data = load_yaml(PEX_FILE)
groups = get_player_groups(player_lower, pex_data)
balance = get_iconomy_balance(player)
lines = [
f"Информация о игроке: {player}",
f"Дата запроса: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}",
"-" * 70, ""
]
lines.append("Группы / привилегии:")
for g in groups:
lines.append(f" • {g}")
lines.append("")
lines.append(f"Баланс (iConomy): {balance:,} Rub".replace(',', ' '))
lines.append("")
if ess:
lines.extend([
"Essentials userdаta:",
f" UUID : {ess['uuid']}",
f" Никнейм : {ess['nickname']}",
f" IP (последний) : {ess['ip']}",
f" AFK : {'✅ да' if ess['afk'] else 'нет'}",
f" GodMode : {'✅ да' if ess['godmode'] else 'нет'}",
f" В тюрьме : {'✅ да' if ess['jailed'] else 'нет'}", "",
f" Последний вход : {format_ts(ess['lastlogin'])}",
f" Последний выход : {format_ts(ess['logout'])}",
f" Последний телепорт : {format_ts(ess['lastteleport'])}",
])
if ess['first_approx']:
lines.append(f" Примерно первый вход: {format_ts(ess['first_approx'])} (по киту)")
lines.append("")
lines.append(f" Домов : {len(ess['homes'])}")
for hname, hdata in ess['homes'].items():
lines.append(
f" • {hname} → {hdata.get('world')} "
f"{safe_coord(hdata, 'x')} {safe_coord(hdata, 'y')} {safe_coord(hdata, 'z')}"
)
lines.append("")
# Защищённый вывод координат
ll = ess.get('lastlocation') or {}
if ll.get('world'):
lines.append(
f" Последняя позиция: {ll.get('world')} "
f"x:{safe_coord(ll, 'x')} y:{safe_coord(ll, 'y')} z:{safe_coord(ll, 'z')}"
)
else:
lines.append(" Последняя позиция: нет данных")
lo = ess.get('logoutlocation') or {}
if lo.get('world'):
lines.append(
f" Позиция выхода: {lo.get('world')} "
f"x:{safe_coord(lo, 'x')} y:{safe_coord(lo, 'y')} z:{safe_coord(lo, 'z')}"
)
else:
lines.append(" Позиция выхода: нет данных")
else:
lines.append("Essentials: данные не найдены")
lines.append("")
lines.append(f"Приваты WorldGuard ({len(regions)} шт):")
if regions:
for r in regions:
lines.extend([
f" • {r['region']} → {r['role']}",
f" Координаты: {r['min']} → {r['max']}",
f" Флаги: {r['flags']}", ""
])
else:
lines.append(" Приватов не найдено")
# Запись в файл
try:
with open(OUTPUT_FILE, 'w', encoding='utf-8') as f:
f.write("n".join(lines))
print(f"✅ Готово! Информация сохранена в {OUTPUT_FILE}")
except Exception as e:
print(f"❌ Ошибка записи файла: {e}")
# Вывод в консоль
print("n" + "n".join(lines))
if __name__ == "__main__":
main()
Завершение:
Вернуться Вчера, 10:18 Просмотров: 2 Автор: xlop



