Skip to content

Commit 1131a6c

Browse files
committed
first commit
0 parents  commit 1131a6c

10 files changed

Lines changed: 5759 additions & 0 deletions

assets.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from PIL import Image
2+
from PIL.ImageTk import PhotoImage
3+
4+
BG_COUNT = 20
5+
6+
7+
class Assets:
8+
@property
9+
def default_favicon(self) -> PhotoImage:
10+
return PhotoImage(Image.open(r"assets/server_icon.png"))
11+
12+
@property
13+
def background(self) -> PhotoImage:
14+
image = Image.open(r"assets/light_dirt_background.png") # 打开图像文件
15+
width, height = image.size
16+
image = image.resize((width * 4, height * 4))
17+
width, height = image.size
18+
bg: Image.Image = Image.new("RGB", (width * BG_COUNT, height * BG_COUNT))
19+
for y in range(BG_COUNT):
20+
for x in range(BG_COUNT):
21+
bg.paste(image, (x * width, y * height))
22+
return PhotoImage(bg)
23+

assets/light_dirt_background.png

197 Bytes
Loading

assets/server_icon.png

3.76 KB
Loading

colorlib.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
class Color:
2+
def __init__(self, *rgb):
3+
if len(rgb) == 1:
4+
rgb = rgb[0]
5+
6+
if isinstance(rgb, str):
7+
rgb = rgb.replace("#", "")
8+
self.red = int(rgb[:2], 16) / 255
9+
self.green = int(rgb[2:4], 16) / 255
10+
self.blue = int(rgb[4:], 16) / 255
11+
elif isinstance(rgb, (tuple, list)):
12+
if isinstance(rgb[0], float):
13+
self.red = rgb[0]
14+
self.green = rgb[1]
15+
self.blue = rgb[2]
16+
elif isinstance(rgb[0], int):
17+
self.red = rgb[0] / 255
18+
self.green = rgb[1] / 255
19+
self.blue = rgb[2] / 255
20+
21+
def set_brightness(self, brightness: float):
22+
self.red = min(max(self.red * brightness, 0), 1)
23+
self.green = min(max(self.green * brightness, 0), 1)
24+
self.blue = min(max(self.blue * brightness, 0), 1)
25+
return self
26+
27+
def reverse(self):
28+
self.red = 1 - self.red
29+
self.green = 1 - self.green
30+
self.blue = 1 - self.blue
31+
return self
32+
33+
@property
34+
def hex(self) -> str:
35+
red = hex(int(self.red * 255))[2:].zfill(2)
36+
green = hex(int(self.green * 255))[2:].zfill(2)
37+
blue = hex(int(self.blue * 255))[2:].zfill(2)
38+
return "#" + red + green + blue
39+
40+
@property
41+
def sum(self) -> float:
42+
return self.red + self.green + self.blue
43+
44+
@property
45+
def sum_avg(self) -> float:
46+
return (self.red + self.green + self.blue) / 3
47+
48+
@property
49+
def fsum(self) -> int:
50+
return int(self.sum * 255)
51+
52+
@property
53+
def fred(self) -> int:
54+
return int(self.red * 255)
55+
56+
@property
57+
def fgreen(self) -> int:
58+
return int(self.green * 255)
59+
60+
@property
61+
def fblue(self) -> int:
62+
return int(self.blue * 255)

info_gui.py

Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
from PIL import Image
2+
from PIL.ImageTk import PhotoImage
3+
from ttkbootstrap.tooltip import ToolTip
4+
from pyperclip import copy as copy_clipboard
5+
from scanner import DescriptionParser
6+
from widgets import *
7+
8+
9+
class InfoWindow(ttk.Toplevel):
10+
def __init__(self, master: Misc, data: ServerInfo):
11+
super(InfoWindow, self).__init__(master=master)
12+
self.favicon_image = None
13+
self.default_favicon = None
14+
self.data = data
15+
self.load_window_title()
16+
17+
self.favicon = ttk.Label(self)
18+
self.MOTD = MOTD(self)
19+
self.tab = Tabs(self)
20+
self.base_info = BaseInfo(self)
21+
self.version_info = VersionInfo(self)
22+
if self.data.mod_server:
23+
self.mod_info = ModInfo(self)
24+
25+
self.load_data(data)
26+
self.pack_widgets()
27+
28+
def load_data(self, data: ServerInfo):
29+
self.data = data
30+
if data.has_favicon:
31+
self.favicon_image = self.data.favicon
32+
else:
33+
self.favicon_image = Image.open(r"assets/server_icon.png")
34+
self.favicon_image = self.favicon_image.resize((128, 128))
35+
self.default_favicon = PhotoImage(self.favicon_image)
36+
self.favicon.configure(image=self.default_favicon)
37+
38+
self.MOTD.load_motd(self.data)
39+
self.base_info.load_data(self.data)
40+
self.version_info.load_data(self.data)
41+
42+
def pack_widgets(self):
43+
self.favicon.pack_configure()
44+
self.MOTD.configure(height=2)
45+
self.MOTD.pack_configure(fill=X)
46+
47+
self.tab.pack(fill=BOTH, expand=True)
48+
self.tab.add(self.base_info, text="基本信息")
49+
self.tab.add(self.version_info, text="版本信息")
50+
if self.data.mod_server:
51+
self.tab.add(self.mod_info, text="模组信息")
52+
53+
def load_window_title(self):
54+
text = ""
55+
for extra in self.data.description_json:
56+
text += extra["text"]
57+
self.title(text)
58+
59+
60+
class PlayersInfo(ttk.Frame):
61+
def __init__(self, master: Misc):
62+
super(PlayersInfo, self).__init__(master)
63+
64+
self.tip = None
65+
self.text = ttk.Label(self, anchor=CENTER)
66+
self.player_list = tk.Listbox(self, width=15)
67+
self.text.pack(side=TOP, fill=X)
68+
self.player_list.pack(side=LEFT, fill=BOTH, expand=True)
69+
self.data = None
70+
71+
def load_data(self, data: ServerInfo):
72+
self.data = data
73+
74+
self.text.configure(text=f"人数:{data.player_online}/{data.player_max}")
75+
for player in data.players:
76+
self.player_list.insert(END, player["name"])
77+
if len(data.players) > 0:
78+
self.tip = ToolTip(self.player_list, "UUID: " + data.players[0]["id"])
79+
self.player_list.bind("<Motion>", self.show_tip)
80+
81+
def show_tip(self, event: tk.Event):
82+
item = self.player_list.nearest(event.y)
83+
if item == -1:
84+
return
85+
uuid = [player for player in self.data.players if player["name"] == self.player_list.get(item)][0]['id']
86+
self.tip.hide_tip()
87+
self.tip = ToolTip(self.player_list, "UUID: " + uuid)
88+
89+
90+
class BaseInfo(ttk.Frame):
91+
def __init__(self, master: Misc):
92+
super(BaseInfo, self).__init__(master)
93+
self.data = None
94+
95+
self.player_list = PlayersInfo(self)
96+
self.host = ttk.Label(self, anchor=CENTER)
97+
self.ping = ttk.Label(self, anchor=CENTER)
98+
self.version = ttk.Label(self, anchor=CENTER)
99+
self.host_copy_b = ttk.Button(self, text="复制地址")
100+
101+
self.pack_widgets()
102+
103+
def load_data(self, data: ServerInfo):
104+
self.data = data
105+
106+
self.player_list.load_data(data)
107+
self.host.configure(text=f"地址:{data.host}:{data.port}")
108+
self.ping.configure(text=f"延迟:{data.ping}ms")
109+
self.version.configure(text=f"版本:{data.version_name}")
110+
self.host_copy_b.configure(command=lambda: copy_clipboard(f"{data.host}:{data.port}"))
111+
112+
def pack_widgets(self):
113+
self.player_list.pack(side=LEFT, fill=BOTH, expand=True)
114+
self.host.pack()
115+
self.ping.pack()
116+
self.version.pack()
117+
self.host_copy_b.pack()
118+
119+
120+
class VersionInfo(ttk.Frame):
121+
def __init__(self, master: Misc):
122+
super(VersionInfo, self).__init__(master)
123+
self.data = None
124+
125+
self.version_name_frame = ttk.Frame(self)
126+
self.version_name_text = ttk.Label(self.version_name_frame, anchor=CENTER)
127+
self.version_name_MOTD = MOTD(self.version_name_frame)
128+
self.minecraft_version = ttk.Label(self, anchor=CENTER)
129+
self.protocol_version = ttk.Label(self, anchor=CENTER)
130+
self.major_name = ttk.Label(self, anchor=CENTER)
131+
self.version_type = ttk.Label(self, anchor=CENTER)
132+
133+
self.bind_tip()
134+
self.pack_widgets()
135+
136+
def bind_tip(self):
137+
tips = [(self.version_name_text, "服务器版本名 (服务器返回结果)"),
138+
(self.version_name_MOTD, "服务器版本名 (服务器返回结果)"),
139+
(self.minecraft_version, "服务器版本名 (就是大家平时的叫法)"),
140+
(self.protocol_version, "服务器协议版本号 (几乎每个Minecraft版本都有不同版本的协议版本号)"),
141+
(self.major_name, "大版本 (该服务器是属于哪个大版本的)"),
142+
(self.version_type, "服务器版本的类型")]
143+
for tip in tips:
144+
ToolTip(tip[0], tip[1], delay=2000)
145+
146+
def pack_widgets(self):
147+
self.version_name_frame.pack()
148+
self.version_name_text.pack(side=LEFT)
149+
self.version_name_MOTD.configure(height=1, width=20)
150+
self.version_name_MOTD.pack(side=LEFT)
151+
self.minecraft_version.pack()
152+
self.protocol_version.pack()
153+
self.major_name.pack()
154+
self.version_type.pack()
155+
156+
def load_data(self, data: ServerInfo):
157+
self.data = data
158+
159+
self.version_name_text.configure(text="版本名:")
160+
temp_data = copy(data)
161+
if "§" in data.version_name:
162+
temp_data.description_json = DescriptionParser.format_chars_to_extras(temp_data.version_name)
163+
else:
164+
temp_data.description_json = [{"text": temp_data.version_name}]
165+
self.version_name_MOTD.load_motd(temp_data)
166+
self.minecraft_version.configure(text=f"正式版本名:{data.protocol_name}")
167+
self.protocol_version.configure(text=f"协议版本号:{data.protocol_version}")
168+
self.major_name.configure(text=f"大版本:{data.protocol_major_name}")
169+
170+
if data.version_type == "release":
171+
self.version_type.configure(text="版本类型:正式版")
172+
elif data.version_type == "release":
173+
self.version_type.configure(text=f"版本类型:快照版")
174+
else:
175+
self.version_type.configure(text=f"版本类型(未检测):{data.version_type}")
176+
177+
178+
class ModInfo(ttk.Frame):
179+
def __init__(self, master: Misc):
180+
super(ModInfo, self).__init__(master)
181+
182+
self.mod_pack_info = ttk.Label(self)
183+
self.mod_list = ttk.Treeview(self, show=HEADINGS, columns=["mod", "version"])
184+
self.mod_info = ttk.Frame(self)
185+
186+
self.pack_widgets()
187+
188+
def pack_widgets(self):
189+
self.mod_list.heading("mod", text="模组名")
190+
self.mod_list.heading("version", text="版本")
191+
self.mod_list.bind("<Button-1>", self.select_mod)
192+
193+
self.mod_pack_info.pack_configure(fill=X)
194+
self.mod_list.pack_configure(fill=BOTH, expand=True, side=LEFT)
195+
self.mod_info.pack_configure(fill=BOTH, expand=True, side=LEFT)
196+
197+
def load_data(self, data: ServerInfo):
198+
self.data = data
199+
200+
if data.mod_pack_server:
201+
print("Mod Pack Server Info:", data.mod_pack_info)
202+
self.mod_list.delete(*self.mod_list.get_children())
203+
for mod in data.mod_list.items():
204+
self.mod_list.insert("", END, values=mod)
205+
206+
def select_mod(self, event: tk.Event):
207+
item_id = self.identify(event.x, event.y)
208+
if item_id == "border":
209+
return
210+
print("PASS ITEM:", item_id)
211+
name, version = self.mod_list.get_children(item_id)
212+
print("Mod Name:", name, " ", "Version:", version)

0 commit comments

Comments
 (0)