-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathScanner.py
144 lines (123 loc) · 6.6 KB
/
Scanner.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
import sys
import json
from mcstatus.server import JavaServer
import time
# Базы данных для подсветки
friends = []
admins = []
# Загружаем данные из файла, если он существует
def load_data():
global friends, admins
try:
with open("players.json", "r") as file:
data = json.load(file)
friends = [player.lower() for player in data.get("friends", [])]
admins = [player.lower() for player in data.get("admins", [])]
except FileNotFoundError:
pass
# Сохраняем данные в файл
def save_data():
data = {"friends": friends, "admins": admins}
with open("players.json", "w") as file:
json.dump(data, file)
def scan_server(ip):
try:
server = JavaServer.lookup(ip)
# Начальная проверка статуса сервера
status = server.status()
current_players = status.players.online # Начальное количество игроков
if current_players > 35:
print(f"На сервере {current_players} игроков. Сканирование будет долгим. Покажем только первые 12.")
status = server.status() # Получаем обновленный статус сервера
visible_players = status.players.sample or [] # Получаем игроков
found_players = [player.name for player in visible_players[:12]] # Берем только первые 12 игроков
print(f"Найдено игроков: {len(found_players)} / {current_players}")
# Выводим первых 12 найденных игроков
print("\n--- Все найденные игроки ---")
for idx, player in enumerate(found_players, 1):
marker = ""
if player.lower() in friends:
marker += " [Friend]"
if player.lower() in admins:
marker += " [Admin]"
print(f"{idx}. {player}{marker}")
print("\nСканирование завершено.")
return
all_players = set() # Множество для хранения уникальных ников
missing_players = current_players
found_players = []
while len(all_players) < missing_players:
status = server.status() # Обновляем статус сервера
visible_players = status.players.sample or [] # Получаем игроков
# Добавляем новых игроков в список
for player in visible_players:
if player.name.lower() not in all_players:
all_players.add(player.name.lower())
found_players.append(player.name)
print(f"Найдено игроков: {len(all_players)} / {missing_players} (еще ищем...)")
time.sleep(2) # Подождём пару секунд перед следующим запросом
# После того как все игроки найдены, выводим информацию о сервере
print("\n--- Информация о сервере ---")
print(f"Ядро сервера: {status.version.name}")
print(f"Версия сервера: {status.version.protocol}")
print(f"Макс. количество игроков: {status.players.max}")
print(f"Всего игроков на сервере: {len(all_players)}")
print("\n--- Все найденные игроки ---")
for idx, player in enumerate(all_players, 1):
marker = ""
if player in friends:
marker += " [Friend]"
if player in admins:
marker += " [Admin]"
print(f"{idx}. {player}{marker}")
except Exception as e:
print(f"Ошибка: {e}")
def main():
load_data() # Загружаем данные из файла при запуске
while True:
print("\nМеню:")
print("1 - Сканировать сервер")
print("2 - Добавить игрока в список")
print("3 - Удалить игрока из списка")
print("4 - Выйти")
choice = input("Выберите опцию: ").strip()
if choice == "1":
ip = input("Введите IP-адрес или доменное имя сервера: ").strip()
if ip.lower() == "exit":
print("Выход из программы.")
sys.exit()
print("Сканирую сервер...")
scan_server(ip)
elif choice == "2":
player_name = input("Введите ник игрока для добавления: ").strip()
team = input("В какую команду добавить (f - Friends, a - Admins): ").strip().lower()
player_name = player_name.lower() # Приводим ник к нижнему регистру
if team == "f":
if player_name not in friends:
friends.append(player_name)
elif team == "a":
if player_name not in admins:
admins.append(player_name)
else:
print("Неверная команда. Используйте 'f' для Friends или 'a' для Admins.")
continue
save_data() # Сохраняем данные в файл
print(f"Игрок {player_name} добавлен в команду {team}.")
elif choice == "3":
player_name = input("Введите ник игрока для удаления: ").strip().lower()
if player_name in friends:
friends.remove(player_name)
print(f"Игрок {player_name} удалён из команды Friends.")
elif player_name in admins:
admins.remove(player_name)
print(f"Игрок {player_name} удалён из команды Admins.")
else:
print(f"Игрок {player_name} не найден в списках.")
save_data() # Сохраняем изменения в файл
elif choice == "4":
print("Завершение работы программы.")
break
else:
print("Неверный выбор. Пожалуйста, выберите опцию снова.")
if __name__ == "__main__":
main()