2025-08-03 13:53:51 +03:00
|
|
|
# Copyright 2025 - Solely by BrotherBoard
|
|
|
|
|
# Intended for personal use only
|
|
|
|
|
# Bug? Feedback? Telegram >> @GalaxyA14user
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
Power v2.7 - With one click
|
|
|
|
|
|
|
|
|
|
Experimental. Feedback is appreciated.
|
|
|
|
|
Adds a dev console tab with some features I find useful.
|
|
|
|
|
Power is mainly focused on the multiplayer side.
|
|
|
|
|
Can be considered a good tool to have around.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
from datetime import datetime as DT
|
|
|
|
|
from typing import override
|
|
|
|
|
from babase import (
|
|
|
|
|
clipboard_is_supported as CIS,
|
|
|
|
|
clipboard_set_text as CST,
|
|
|
|
|
Plugin,
|
|
|
|
|
app
|
|
|
|
|
)
|
|
|
|
|
from babase._devconsole import (
|
|
|
|
|
DevConsoleTabEntry as ENT,
|
|
|
|
|
DevConsoleTab as TAB
|
|
|
|
|
)
|
|
|
|
|
from bascenev1 import (
|
|
|
|
|
get_connection_to_host_info_2 as HOST,
|
|
|
|
|
disconnect_from_host as LEAVE,
|
|
|
|
|
disconnect_client as DISC,
|
|
|
|
|
broadcastmessage as push,
|
|
|
|
|
get_chat_messages as GCM,
|
|
|
|
|
connect_to_party as CON,
|
|
|
|
|
get_game_roster as ROST,
|
|
|
|
|
chatmessage as chat
|
|
|
|
|
)
|
|
|
|
|
from bauiv1 import (
|
|
|
|
|
get_string_width as sw,
|
|
|
|
|
SpecialChar as sc,
|
|
|
|
|
apptimer as teck,
|
|
|
|
|
charstr as cs,
|
|
|
|
|
Call
|
|
|
|
|
)
|
|
|
|
|
|
2025-08-10 13:02:22 +00:00
|
|
|
|
2025-08-03 13:53:51 +03:00
|
|
|
class Power(TAB):
|
|
|
|
|
def __init__(s):
|
2025-08-10 13:02:22 +00:00
|
|
|
s.j = [None, None, None]
|
|
|
|
|
s.ji = 1
|
|
|
|
|
[setattr(s, _, None) for _ in 'cpnh']
|
|
|
|
|
[setattr(s, _, {}) for _ in ['rr', 'hi']]
|
|
|
|
|
[setattr(s, _, []) for _ in ['cm', 'og', 'r', 'ls']]
|
|
|
|
|
[setattr(s, _, 0) for _ in ['ii', 'eii', 'ci', 're', 'ri', 'eri', 'li', 'lii']]
|
|
|
|
|
teck(3, s.spy)
|
|
|
|
|
|
2025-08-03 13:53:51 +03:00
|
|
|
def rf(s):
|
2025-08-10 13:02:22 +00:00
|
|
|
try:
|
|
|
|
|
s.request_refresh()
|
|
|
|
|
except RuntimeError:
|
|
|
|
|
pass
|
|
|
|
|
|
2025-08-03 13:53:51 +03:00
|
|
|
def spy(s):
|
|
|
|
|
_ = 0
|
|
|
|
|
r = ROST()
|
|
|
|
|
if r != s.r:
|
2025-08-10 13:02:22 +00:00
|
|
|
s.rr = {i['display_string']: (i['client_id'], i['players']) for i in r}
|
2025-08-03 13:53:51 +03:00
|
|
|
s.r = r
|
|
|
|
|
_ = 1
|
|
|
|
|
h = HOST()
|
|
|
|
|
if h != s.h:
|
|
|
|
|
s.ri = 0
|
|
|
|
|
s.h = h
|
|
|
|
|
_ = 1
|
|
|
|
|
t = getattr(s.h, 'name', 'Not in a server')
|
|
|
|
|
a = getattr(s.h, 'address', '127.0.0.1')
|
|
|
|
|
p = getattr(s.h, 'port', '43210')
|
|
|
|
|
if s.h:
|
|
|
|
|
tt = t if t.strip() else '...'
|
|
|
|
|
if t.strip() or not any(key[1] == a for key in s.hi):
|
|
|
|
|
s.hi[(tt, a)] = (tt, p)
|
|
|
|
|
if tt != '...':
|
|
|
|
|
if ('...', a) in s.hi:
|
|
|
|
|
del s.hi[('...', a)]
|
|
|
|
|
ng = GCM()
|
|
|
|
|
if s.og != ng:
|
|
|
|
|
s.og = ng
|
|
|
|
|
ls = ng[-1]
|
|
|
|
|
ch = s.cm[0][1] if len(s.cm) else 0
|
2025-08-10 13:02:22 +00:00
|
|
|
if ch and ls == s.cm[0][0]:
|
|
|
|
|
s.cm[0] = (ls, ch+1)
|
|
|
|
|
else:
|
|
|
|
|
s.cm.insert(0, (ls, 1))
|
|
|
|
|
if s.ci:
|
|
|
|
|
s.ci += 1
|
2025-08-03 13:53:51 +03:00
|
|
|
_ = 1
|
|
|
|
|
_ and s.rf()
|
2025-08-10 13:02:22 +00:00
|
|
|
teck(0.1, s.spy)
|
|
|
|
|
|
2025-08-03 13:53:51 +03:00
|
|
|
@override
|
|
|
|
|
def refresh(s):
|
|
|
|
|
sf = s.width / 1605.3
|
|
|
|
|
zf = s.height / 648
|
|
|
|
|
x = -s.width/2
|
2025-08-10 13:02:22 +00:00
|
|
|
T, B = s.text, s.button
|
|
|
|
|
if len(s.r) and s.ri >= len(s.r):
|
|
|
|
|
s.ri = len(s.r) - 1
|
|
|
|
|
if len(s.r) and s.eri >= len(s.r):
|
|
|
|
|
s.eri = len(s.r) - 1
|
2025-08-03 13:53:51 +03:00
|
|
|
if s.j[0] == 'JRejoin' and s.ji <= s.re:
|
|
|
|
|
s.ji = s.re + 1
|
2025-08-10 13:02:22 +00:00
|
|
|
push('Job time cannot be less than rejoin time\nwhen job is JRejoin. Updated job time to ' +
|
|
|
|
|
str(s.ji), color=(1, 1, 0))
|
2025-08-03 13:53:51 +03:00
|
|
|
if s.height > 100:
|
|
|
|
|
B(
|
|
|
|
|
cs(sc.UP_ARROW),
|
|
|
|
|
pos=(x + 10 * sf, 606*zf),
|
2025-08-10 13:02:22 +00:00
|
|
|
size=(280*sf, 35*zf),
|
2025-08-03 13:53:51 +03:00
|
|
|
disabled=s.eri <= 0,
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(s.mv, 'eri', -1)
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
cs(sc.DOWN_ARROW),
|
|
|
|
|
pos=(x + 10 * sf, 290*zf),
|
2025-08-10 13:02:22 +00:00
|
|
|
size=(280*sf, 35*zf),
|
2025-08-03 13:53:51 +03:00
|
|
|
disabled=s.eri >= len(s.r)-7,
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(s.mv, 'eri', 1)
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
nt = "No roster detected\nJoin some public party"
|
|
|
|
|
w = GSW(nt)
|
|
|
|
|
0 if len(s.r) else T(
|
|
|
|
|
nt,
|
|
|
|
|
pos=(x + 150 * sf, 495*zf),
|
|
|
|
|
h_align='center',
|
|
|
|
|
v_align='top',
|
2025-08-10 13:02:22 +00:00
|
|
|
scale=1 if w < (290*sf) else (290*sf)/w
|
|
|
|
|
)
|
|
|
|
|
for i, z in enumerate(s.rr.items()):
|
|
|
|
|
if i < s.eri:
|
|
|
|
|
continue
|
|
|
|
|
if i >= (s.eri+7):
|
|
|
|
|
break
|
|
|
|
|
n, g = z
|
|
|
|
|
c, p = g
|
2025-08-03 13:53:51 +03:00
|
|
|
w = GSW(n)
|
|
|
|
|
B(
|
|
|
|
|
n,
|
|
|
|
|
size=(280 * sf, 37*zf),
|
|
|
|
|
pos=(x + 10 * sf, (564-39*(i-s.eri))*zf),
|
2025-08-10 13:02:22 +00:00
|
|
|
style=[['blue', 'blue_bright'], ['purple', 'purple_bright']][not p][s.c == c],
|
|
|
|
|
call=Call(s.prv, c, p, n),
|
2025-08-03 13:53:51 +03:00
|
|
|
label_scale=1 if w < 280 * sf else (280 * sf)/w
|
|
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'',
|
|
|
|
|
size=(280 * sf, 2),
|
|
|
|
|
pos=(x + 10 * sf, 280*zf),
|
|
|
|
|
style='bright'
|
|
|
|
|
)
|
|
|
|
|
bb = s.c is None
|
|
|
|
|
B(
|
2025-08-10 13:02:22 +00:00
|
|
|
'Bomb' if bb else (['Client', 'Host'][s.c == -1]+f' {s.c}'),
|
2025-08-03 13:53:51 +03:00
|
|
|
pos=(x + 10 * sf, 230*zf),
|
|
|
|
|
size=(280 * sf, 40*zf),
|
|
|
|
|
disabled=bb,
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(push, str(s.n))
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'Mention',
|
|
|
|
|
size=(280 * sf, 40*zf),
|
|
|
|
|
pos=(x + 10 * sf, 185*zf),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(chat, str(s.n)),
|
2025-08-03 13:53:51 +03:00
|
|
|
disabled=bb
|
|
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'Players',
|
|
|
|
|
size=(280 * sf, 40*zf),
|
|
|
|
|
pos=(x + 10 * sf, 140*zf),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(push, '\n'.join(
|
|
|
|
|
[' '.join([f'{i}={j}' for i, j in _.items()]) for _ in s.p]) if s.p else ''),
|
2025-08-03 13:53:51 +03:00
|
|
|
disabled=bb or (not s.p)
|
|
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'Kick',
|
|
|
|
|
size=(280 * sf, 40*zf),
|
|
|
|
|
pos=(x + 10 * sf, 95*zf),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(KICK, lambda: s.rr[s.n][0]),
|
|
|
|
|
disabled=bb or (s.c == -1)
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'JKick',
|
|
|
|
|
size=(280 * sf, 40*zf),
|
|
|
|
|
pos=(x + 10 * sf, 50*zf),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(s.job, Call(KICK, lambda: s.rr[s.n][0]), ['JKick', s.c, s.n]),
|
|
|
|
|
disabled=bb or (s.c == -1)
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'Vote',
|
|
|
|
|
size=(280 * sf, 40*zf),
|
|
|
|
|
pos=(x + 10 * sf, 5*zf),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(chat, '1'),
|
2025-08-03 13:53:51 +03:00
|
|
|
disabled=not s.r
|
|
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'',
|
|
|
|
|
size=(2, 635*zf),
|
|
|
|
|
pos=(x + 300 * sf, 5*zf),
|
|
|
|
|
style='bright'
|
|
|
|
|
)
|
2025-08-10 13:02:22 +00:00
|
|
|
t = getattr(s.h, 'name', 'Not in a server')
|
|
|
|
|
a = getattr(s.h, 'address', '127.0.0.1')
|
|
|
|
|
p = getattr(s.h, 'port', '43210')
|
2025-08-03 13:53:51 +03:00
|
|
|
w = GSW(t)
|
|
|
|
|
B(
|
|
|
|
|
t if t.strip() else 'Loading...',
|
|
|
|
|
size=(400 * sf, 35*zf),
|
|
|
|
|
pos=(x + 311 * sf, 606*zf),
|
|
|
|
|
disabled=not s.h,
|
|
|
|
|
label_scale=1 if w < 390 * sf else (390 * sf)/w,
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(push, f"{t}\nHosted on build {getattr(s.h, 'build_number', '0')}" if t.strip(
|
|
|
|
|
) else 'Server is still loading...\nIf it remains stuck on this\nthen either party is full, or a network issue.'),
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
w = GSW(a)
|
|
|
|
|
B(
|
|
|
|
|
a,
|
|
|
|
|
size=(300 * sf, 35*zf),
|
|
|
|
|
pos=(x + 311 * sf, 568*zf),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(COPY, a),
|
2025-08-03 13:53:51 +03:00
|
|
|
disabled=not s.h,
|
|
|
|
|
label_scale=1 if w < 290 * sf else (290 * sf)/w
|
|
|
|
|
)
|
|
|
|
|
w = GSW(str(p))
|
|
|
|
|
B(
|
|
|
|
|
str(p),
|
|
|
|
|
size=(97 * sf, 35*zf),
|
|
|
|
|
pos=(x + 614 * sf, 568*zf),
|
|
|
|
|
disabled=not s.h,
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(COPY, str(p)),
|
2025-08-03 13:53:51 +03:00
|
|
|
label_scale=1 if w < 90 * sf else (90 * sf)/w
|
|
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'Leave',
|
|
|
|
|
size=(400 * sf, 35*zf),
|
|
|
|
|
pos=(x + 311 * sf, 530*zf),
|
|
|
|
|
call=LEAVE,
|
|
|
|
|
disabled=not s.h
|
|
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'Rejoin',
|
|
|
|
|
size=(200 * sf, 35*zf),
|
|
|
|
|
pos=(x + 311 * sf, 492*zf),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(REJOIN, a, p, lambda: s.re),
|
2025-08-03 13:53:51 +03:00
|
|
|
disabled=not s.h
|
|
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'JRejoin',
|
|
|
|
|
size=(197 * sf, 35*zf),
|
|
|
|
|
pos=(x + 514 * sf, 492*zf),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(s.job, Call(REJOIN, a, p, lambda: s.re), ['JRejoin', a, str(p)]),
|
2025-08-03 13:53:51 +03:00
|
|
|
disabled=not s.h
|
|
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'+',
|
|
|
|
|
size=(131 * sf, 35*zf),
|
|
|
|
|
pos=(x + 579 * sf, 454*zf),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(s.mv, 're', 1)
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
str(s.re or 0.1),
|
|
|
|
|
size=(131 * sf, 35*zf),
|
|
|
|
|
pos=(x + 444 * sf, 454*zf),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(
|
|
|
|
|
push, f"Rejoins after {s.re or 0.1} second{['', 's'][s.re != 1]}\nKeep this 0.1 unless server kicks fast rejoins\nLife in server = job time - rejoin time")
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'-',
|
|
|
|
|
size=(131 * sf, 35*zf),
|
|
|
|
|
pos=(x + 311 * sf, 454*zf),
|
2025-08-10 13:02:22 +00:00
|
|
|
disabled=s.re <= 0.5,
|
|
|
|
|
call=Call(s.mv, 're', -1)
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'',
|
|
|
|
|
size=(2, 635*zf),
|
|
|
|
|
pos=(x + 720 * sf, 5*zf),
|
|
|
|
|
style='bright'
|
|
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'',
|
|
|
|
|
size=(400 * sf, 2),
|
|
|
|
|
pos=(x + 311 * sf, 445*zf),
|
|
|
|
|
style='bright'
|
|
|
|
|
)
|
2025-08-10 13:02:22 +00:00
|
|
|
for i, e in enumerate(s.hi.items()):
|
|
|
|
|
if i < s.eii:
|
|
|
|
|
continue
|
|
|
|
|
if i >= (s.eii+9):
|
|
|
|
|
break
|
|
|
|
|
g, v = e
|
|
|
|
|
_, a = g
|
|
|
|
|
n, p = v
|
2025-08-03 13:53:51 +03:00
|
|
|
w = GSW(n)
|
|
|
|
|
B(
|
|
|
|
|
n,
|
|
|
|
|
size=(400 * sf, 37*zf),
|
|
|
|
|
pos=(x + 311 * sf, (358-39*(i-s.eii))*zf),
|
|
|
|
|
label_scale=1 if w < 290 * sf else (290 * sf)/w,
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(JOIN, a, p, False),
|
2025-08-03 13:53:51 +03:00
|
|
|
disabled=n == '...'
|
|
|
|
|
)
|
|
|
|
|
nt = "Server join history\nServers you join are saved here"
|
|
|
|
|
w = GSW(nt)
|
|
|
|
|
0 if len(s.hi) else T(
|
|
|
|
|
nt,
|
|
|
|
|
pos=(x + 510 * sf, 265*zf),
|
|
|
|
|
v_align='top',
|
2025-08-10 13:02:22 +00:00
|
|
|
scale=1 if w < (380*sf) else (380*sf)/w
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
cs(sc.DOWN_ARROW),
|
|
|
|
|
pos=(x + 311 * sf, 8*zf),
|
|
|
|
|
size=(398*sf, 35*zf),
|
|
|
|
|
disabled=s.eii >= len(s.hi)-9,
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(s.mv, 'eii', 1)
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
cs(sc.UP_ARROW),
|
|
|
|
|
pos=(x + 311 * sf, 400*zf),
|
|
|
|
|
size=(400*sf, 35*zf),
|
|
|
|
|
disabled=s.eii <= 0,
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(s.mv, 'eii', -1)
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
bb = s.j[0] is None
|
|
|
|
|
B(
|
|
|
|
|
'No job' if bb else 'Job',
|
|
|
|
|
size=(300 * sf, 35*zf),
|
|
|
|
|
pos=(x + 727 * sf, 606*zf),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(push, s.j[0]),
|
2025-08-03 13:53:51 +03:00
|
|
|
disabled=bb
|
|
|
|
|
)
|
|
|
|
|
w = 0 if bb else GSW(str(s.j[1]))
|
|
|
|
|
B(
|
|
|
|
|
'Target' if bb else str(s.j[1]),
|
|
|
|
|
size=(300 * sf, 35*zf),
|
|
|
|
|
pos=(x + 727 * sf, 568*zf),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(push, s.j[2]),
|
2025-08-03 13:53:51 +03:00
|
|
|
disabled=bb,
|
2025-08-10 13:02:22 +00:00
|
|
|
label_scale=1 if w < 110 * sf else (110 * sf)/w
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'Stop',
|
|
|
|
|
size=(300 * sf, 35*zf),
|
|
|
|
|
pos=(x + 727 * sf, 530*zf),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(s.job, None, [None, None, None]),
|
2025-08-03 13:53:51 +03:00
|
|
|
disabled=bb
|
|
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'+',
|
|
|
|
|
size=(96 * sf, 35*zf),
|
|
|
|
|
pos=(x + 931 * sf, 492*zf),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(s.mv, 'ji', 1)
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
str(s.ji or 0.1),
|
|
|
|
|
size=(100 * sf, 35*zf),
|
|
|
|
|
pos=(x + 828 * sf, 492*zf),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(push, f"Job runs every {s.ji or 0.1} second{['', 's'][s.ji != 1]}")
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'-',
|
|
|
|
|
size=(98 * sf, 35*zf),
|
|
|
|
|
pos=(x + 727 * sf, 492*zf),
|
2025-08-10 13:02:22 +00:00
|
|
|
disabled=s.ji <= 0.5,
|
|
|
|
|
call=Call(s.mv, 'ji', -1)
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'Power',
|
|
|
|
|
size=(300 * sf, 35*zf),
|
|
|
|
|
pos=(x + 727 * sf, 454*zf),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(push, 'Power v2.5 FullUI\nCollapse dev console to switch to MinUI')
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'',
|
|
|
|
|
size=(300 * sf, 2),
|
|
|
|
|
pos=(x + 727 * sf, 445*zf),
|
|
|
|
|
style='bright'
|
|
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'',
|
|
|
|
|
size=(2, 635*zf),
|
|
|
|
|
pos=(x + 1034 * sf, 5*zf),
|
|
|
|
|
style='bright'
|
|
|
|
|
)
|
|
|
|
|
0 if len(s.cm) else T(
|
|
|
|
|
'Chat is still empty.\nHurry up and fill it with nonesense',
|
|
|
|
|
pos=(x+1320 * sf, 330 * zf)
|
|
|
|
|
)
|
2025-08-10 13:02:22 +00:00
|
|
|
for i, g in enumerate(s.cm):
|
|
|
|
|
if i < s.ci:
|
|
|
|
|
continue
|
|
|
|
|
if i >= s.ci+15:
|
|
|
|
|
break
|
2025-08-03 13:53:51 +03:00
|
|
|
i = i - s.ci
|
2025-08-10 13:02:22 +00:00
|
|
|
m, _ = g
|
|
|
|
|
sn, ms = m.split(': ', 1)
|
2025-08-03 13:53:51 +03:00
|
|
|
w = GSW(sn)
|
2025-08-10 13:02:22 +00:00
|
|
|
w = [w, 30*sf][w < 30*sf]
|
|
|
|
|
s1 = [w, 200*sf][w > 200*sf]
|
2025-08-03 13:53:51 +03:00
|
|
|
B(
|
|
|
|
|
sn,
|
2025-08-10 13:02:22 +00:00
|
|
|
size=(s1, 35*zf),
|
2025-08-03 13:53:51 +03:00
|
|
|
pos=(x + 1040*sf, (48+37*i)*zf),
|
|
|
|
|
style='purple',
|
2025-08-10 13:02:22 +00:00
|
|
|
label_scale=1 if w < (s1-10*sf) else (s1-10*sf)/w,
|
|
|
|
|
call=Call(s.chk, sn)
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
2025-08-10 13:02:22 +00:00
|
|
|
s2 = 555*sf - s1 - 53*(_ > 1)
|
2025-08-03 13:53:51 +03:00
|
|
|
B(
|
|
|
|
|
'',
|
2025-08-10 13:02:22 +00:00
|
|
|
size=(s2, 35*zf),
|
2025-08-03 13:53:51 +03:00
|
|
|
pos=(x + 1045*sf+s1, (48+37*i)*zf),
|
|
|
|
|
style='black'
|
|
|
|
|
)
|
|
|
|
|
w = GSW(ms)
|
|
|
|
|
T(
|
|
|
|
|
ms,
|
|
|
|
|
pos=(x + s1+(1050)*sf, (48+17+37*i)*zf),
|
2025-08-10 13:02:22 +00:00
|
|
|
scale=1 if w < (s2-10*sf) else (s2-10*sf)/w,
|
2025-08-03 13:53:51 +03:00
|
|
|
h_align='left'
|
|
|
|
|
)
|
|
|
|
|
z = f'x{_}'
|
|
|
|
|
w = GSW(z)
|
2025-08-10 13:02:22 +00:00
|
|
|
_ > 1 and B(
|
2025-08-03 13:53:51 +03:00
|
|
|
z,
|
2025-08-10 13:02:22 +00:00
|
|
|
pos=(x+s1+s2+(1050)*sf, (48+37*i)*zf),
|
|
|
|
|
size=(50*sf, 35*zf),
|
|
|
|
|
label_scale=1 if w < (40*sf) else (40*sf)/w,
|
2025-08-03 13:53:51 +03:00
|
|
|
style='yellow_bright'
|
|
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
cs(sc.DOWN_ARROW),
|
2025-08-10 13:02:22 +00:00
|
|
|
pos=(x+1042*sf, 8*zf),
|
|
|
|
|
size=(555*sf, 35*zf),
|
|
|
|
|
call=Call(s.mv, 'ci', -1),
|
2025-08-03 13:53:51 +03:00
|
|
|
disabled=s.ci <= 0 or not s.cm
|
|
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
cs(sc.UP_ARROW),
|
2025-08-10 13:02:22 +00:00
|
|
|
pos=(x+1042*sf, 606*zf),
|
|
|
|
|
size=(555*sf, 35*zf),
|
|
|
|
|
call=Call(s.mv, 'ci', 1),
|
2025-08-03 13:53:51 +03:00
|
|
|
disabled=(s.ci >= len(s.cm)-15) or not s.cm
|
|
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
cs(sc.DOWN_ARROW),
|
2025-08-10 13:02:22 +00:00
|
|
|
pos=(x+727*sf, 8*zf),
|
|
|
|
|
size=(300*sf, 35*zf),
|
2025-08-03 13:53:51 +03:00
|
|
|
disabled=(s.li >= len(s.ls)-16) or not s.ls,
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(s.mv, 'li', 1)
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
cs(sc.UP_ARROW),
|
2025-08-10 13:02:22 +00:00
|
|
|
pos=(x+727*sf, 400*zf),
|
|
|
|
|
size=(300*sf, 35*zf),
|
|
|
|
|
disabled=s.li <= 0,
|
|
|
|
|
call=Call(s.mv, 'li', -1)
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
0 if s.ls else T(
|
|
|
|
|
'Job logs here\nLike you even care',
|
2025-08-10 13:02:22 +00:00
|
|
|
pos=(x+875*sf, 232*zf)
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
2025-08-10 13:02:22 +00:00
|
|
|
for _, g in enumerate(s.ls):
|
|
|
|
|
if _ < s.li:
|
|
|
|
|
continue
|
|
|
|
|
if _ >= s.li+16:
|
|
|
|
|
break
|
2025-08-03 13:53:51 +03:00
|
|
|
_ = _ - s.li
|
2025-08-10 13:02:22 +00:00
|
|
|
l, t = g
|
2025-08-03 13:53:51 +03:00
|
|
|
B(
|
|
|
|
|
'',
|
2025-08-10 13:02:22 +00:00
|
|
|
pos=(x+727*sf, (376-_*22)*zf),
|
|
|
|
|
size=(300*sf, 20*zf),
|
2025-08-03 13:53:51 +03:00
|
|
|
label_scale=0.7,
|
|
|
|
|
corner_radius=0,
|
|
|
|
|
style='black',
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(push, t)
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
T(
|
|
|
|
|
l,
|
2025-08-10 13:02:22 +00:00
|
|
|
pos=(x+732*sf, (386-_*22)*zf),
|
2025-08-03 13:53:51 +03:00
|
|
|
scale=0.6,
|
|
|
|
|
h_align='left'
|
|
|
|
|
)
|
|
|
|
|
else:
|
|
|
|
|
B(
|
|
|
|
|
cs(sc.DOWN_ARROW),
|
|
|
|
|
pos=(x + 10 * sf, 10),
|
|
|
|
|
size=(30 * sf, s.height-17),
|
|
|
|
|
disabled=(s.ri >= len(s.r)-3) or not s.r,
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(s.mv, 'ri', 1)
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
cs(sc.UP_ARROW),
|
|
|
|
|
pos=(x + 250 * sf, 10),
|
|
|
|
|
size=(30 * sf, s.height-17),
|
|
|
|
|
disabled=(s.ri <= 0) or not s.r,
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(s.mv, 'ri', -1)
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
nt = "No roster\nYou're alone"
|
|
|
|
|
w = GSW(nt)
|
|
|
|
|
0 if len(s.r) else T(
|
|
|
|
|
nt,
|
|
|
|
|
pos=(x + 147 * sf, s.height-17),
|
|
|
|
|
h_align='center',
|
|
|
|
|
v_align='top',
|
2025-08-10 13:02:22 +00:00
|
|
|
scale=1 if w < (200*sf) else (200*sf)/w
|
|
|
|
|
)
|
|
|
|
|
for i, z in enumerate(s.rr.items()):
|
|
|
|
|
if i < s.ri:
|
|
|
|
|
continue
|
|
|
|
|
if i >= (s.ri+3):
|
|
|
|
|
break
|
|
|
|
|
n, g = z
|
|
|
|
|
c, p = g
|
2025-08-03 13:53:51 +03:00
|
|
|
w = GSW(n)
|
|
|
|
|
B(
|
|
|
|
|
n,
|
|
|
|
|
size=(210 * sf, 27),
|
|
|
|
|
pos=(x + 40 * sf, s.height-35-27*(i-s.ri)),
|
2025-08-10 13:02:22 +00:00
|
|
|
style=[['blue', 'blue_bright'], ['purple', 'purple_bright']][not p][s.c == c],
|
|
|
|
|
call=Call(s.prv, c, p, n),
|
2025-08-03 13:53:51 +03:00
|
|
|
label_scale=1 if w < 200 * sf else (200 * sf)/w
|
|
|
|
|
)
|
|
|
|
|
bb = s.c is None
|
|
|
|
|
B(
|
2025-08-10 13:02:22 +00:00
|
|
|
'Bomb' if bb else (['Client', 'Host'][s.c == -1]+f' {s.c}'),
|
2025-08-03 13:53:51 +03:00
|
|
|
pos=(x + 287 * sf, s.height-34),
|
|
|
|
|
size=(120 * sf, 27),
|
|
|
|
|
disabled=bb,
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(push, str(s.n))
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'Mention',
|
|
|
|
|
size=(120 * sf, 27),
|
|
|
|
|
pos=(x + 287 * sf, s.height-90),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(chat, str(s.n)),
|
2025-08-03 13:53:51 +03:00
|
|
|
disabled=bb
|
|
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'Players',
|
|
|
|
|
size=(120 * sf, 27),
|
|
|
|
|
pos=(x + 287 * sf, s.height-62),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(push, '\n'.join(
|
|
|
|
|
[' '.join([f'{i}={j}' for i, j in _.items()]) for _ in s.p]) if s.p else ''),
|
2025-08-03 13:53:51 +03:00
|
|
|
disabled=bb or (not s.p)
|
|
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'Kick',
|
|
|
|
|
size=(120 * sf, 27),
|
|
|
|
|
pos=(x + 407 * sf, s.height-34),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(KICK, lambda: s.rr[s.n][0]),
|
|
|
|
|
disabled=bb or (s.c == -1)
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'JKick',
|
|
|
|
|
size=(120 * sf, 27),
|
|
|
|
|
pos=(x + 407 * sf, s.height-62),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(s.job, Call(KICK, lambda: s.rr[s.n][0]), ['JKick', s.c, s.n]),
|
|
|
|
|
disabled=bb or (s.c == -1)
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'Vote',
|
|
|
|
|
size=(120 * sf, 27),
|
|
|
|
|
pos=(x + 407 * sf, s.height-90),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(chat, '1'),
|
2025-08-03 13:53:51 +03:00
|
|
|
disabled=not s.r
|
|
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'',
|
|
|
|
|
size=(2, s.height-17),
|
|
|
|
|
pos=(x + 535 * sf, 10),
|
|
|
|
|
style='bright'
|
|
|
|
|
)
|
|
|
|
|
bb = s.j[0] is None
|
|
|
|
|
B(
|
|
|
|
|
'No job' if bb else 'Job',
|
|
|
|
|
size=(120 * sf, 27),
|
|
|
|
|
pos=(x + 544 * sf, s.height-34),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(push, s.j[0]),
|
2025-08-03 13:53:51 +03:00
|
|
|
disabled=bb
|
|
|
|
|
)
|
|
|
|
|
w = 0 if bb else GSW(str(s.j[1]))
|
|
|
|
|
B(
|
|
|
|
|
'Target' if bb else str(s.j[1]),
|
|
|
|
|
size=(120 * sf, 27),
|
|
|
|
|
pos=(x + 544 * sf, s.height-62),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(push, s.j[2]),
|
2025-08-03 13:53:51 +03:00
|
|
|
disabled=bb,
|
2025-08-10 13:02:22 +00:00
|
|
|
label_scale=1 if w < 110 * sf else (110 * sf)/w
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'Stop',
|
|
|
|
|
size=(120 * sf, 27),
|
|
|
|
|
pos=(x + 544 * sf, s.height-90),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(s.job, None, [None, None, None]),
|
2025-08-03 13:53:51 +03:00
|
|
|
disabled=bb
|
|
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'+',
|
|
|
|
|
size=(50 * sf, 27),
|
|
|
|
|
pos=(x + 664 * sf, s.height-34),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(s.mv, 'ji', 1)
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
str(s.ji or 0.1),
|
|
|
|
|
size=(50 * sf, 27),
|
|
|
|
|
pos=(x + 664 * sf, s.height-62),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(push, f"Job runs every {s.ji or 0.1} second{['', 's'][s.ji != 1]}")
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'-',
|
|
|
|
|
size=(50 * sf, 27),
|
|
|
|
|
pos=(x + 664 * sf, s.height-90),
|
2025-08-10 13:02:22 +00:00
|
|
|
disabled=s.ji <= 0.5,
|
|
|
|
|
call=Call(s.mv, 'ji', -1)
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'',
|
|
|
|
|
size=(2, s.height-17),
|
|
|
|
|
pos=(x + 722 * sf, 10),
|
|
|
|
|
style='bright'
|
|
|
|
|
)
|
2025-08-10 13:02:22 +00:00
|
|
|
t = getattr(s.h, 'name', 'Not in a server')
|
|
|
|
|
a = getattr(s.h, 'address', '127.0.0.1')
|
|
|
|
|
p = getattr(s.h, 'port', '43210')
|
2025-08-03 13:53:51 +03:00
|
|
|
w = GSW(t)
|
|
|
|
|
B(
|
|
|
|
|
t if t.strip() else 'Loading...',
|
|
|
|
|
size=(300 * sf, 27),
|
|
|
|
|
pos=(x + 732 * sf, s.height-34),
|
|
|
|
|
disabled=not s.h,
|
|
|
|
|
label_scale=1 if w < 290 * sf else (290 * sf)/w,
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(push, f"{t}\nHosted on build {getattr(s.h, 'build_number', '0')}" if t.strip(
|
|
|
|
|
) else 'Server is still loading...\nIf it remains stuck on this\nthen either party is full, or a network issue.'),
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
w = GSW(a)
|
|
|
|
|
B(
|
|
|
|
|
a,
|
|
|
|
|
size=(200 * sf, 27),
|
|
|
|
|
pos=(x + 732 * sf, s.height-62),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(COPY, a),
|
2025-08-03 13:53:51 +03:00
|
|
|
disabled=not s.h,
|
|
|
|
|
label_scale=1 if w < 190 * sf else (190 * sf)/w
|
|
|
|
|
)
|
|
|
|
|
w = GSW(str(p))
|
|
|
|
|
B(
|
|
|
|
|
str(p),
|
|
|
|
|
size=(97 * sf, 27),
|
|
|
|
|
pos=(x + 935 * sf, s.height-62),
|
|
|
|
|
disabled=not s.h,
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(COPY, str(p)),
|
2025-08-03 13:53:51 +03:00
|
|
|
label_scale=1 if w < 90 * sf else (90 * sf)/w
|
|
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'Leave',
|
|
|
|
|
size=(100 * sf, 27),
|
|
|
|
|
pos=(x + 732 * sf, s.height-90),
|
|
|
|
|
call=LEAVE,
|
|
|
|
|
disabled=not s.h
|
|
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'Rejoin',
|
|
|
|
|
size=(97 * sf, 27),
|
|
|
|
|
pos=(x + 835 * sf, s.height-90),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(REJOIN, a, p, lambda: s.re),
|
2025-08-03 13:53:51 +03:00
|
|
|
disabled=not s.h
|
|
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'JRejoin',
|
|
|
|
|
size=(97 * sf, 27),
|
|
|
|
|
pos=(x + 935 * sf, s.height-90),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(s.job, Call(REJOIN, a, p, lambda: s.re), ['JRejoin', a, str(p)]),
|
2025-08-03 13:53:51 +03:00
|
|
|
disabled=not s.h
|
|
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'+',
|
|
|
|
|
size=(50 * sf, 27),
|
|
|
|
|
pos=(x + 1035 * sf, s.height-34),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(s.mv, 're', 1)
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
str(s.re or 0.1),
|
|
|
|
|
size=(50 * sf, 27),
|
|
|
|
|
pos=(x + 1035 * sf, s.height-62),
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(
|
|
|
|
|
push, f"Rejoins after {s.re or 0.1} second{['', 's'][s.re != 1]}\nKeep this 0.1 unless server kicks fast rejoins\nLife in server = job time - rejoin time")
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'-',
|
|
|
|
|
size=(50 * sf, 27),
|
|
|
|
|
pos=(x + 1035 * sf, s.height-90),
|
2025-08-10 13:02:22 +00:00
|
|
|
disabled=s.re <= 0.5,
|
|
|
|
|
call=Call(s.mv, 're', -1)
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'',
|
|
|
|
|
size=(2, s.height-17),
|
|
|
|
|
pos=(x + 1092 * sf, 10),
|
|
|
|
|
style='bright'
|
|
|
|
|
)
|
2025-08-10 13:02:22 +00:00
|
|
|
for i, e in enumerate(s.hi.items()):
|
|
|
|
|
if i < s.ii:
|
|
|
|
|
continue
|
|
|
|
|
if i >= (s.ii+3):
|
|
|
|
|
break
|
|
|
|
|
g, v = e
|
|
|
|
|
_, a = g
|
|
|
|
|
n, p = v
|
2025-08-03 13:53:51 +03:00
|
|
|
w = GSW(n)
|
|
|
|
|
B(
|
|
|
|
|
n,
|
|
|
|
|
size=(300 * sf, 27),
|
|
|
|
|
pos=(x + 1134 * sf, s.height-34-28*(i-s.ii)),
|
|
|
|
|
label_scale=1 if w < 290 * sf else (290 * sf)/w,
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(JOIN, a, p, False),
|
2025-08-03 13:53:51 +03:00
|
|
|
disabled=n == '...'
|
|
|
|
|
)
|
|
|
|
|
nt = "Your server join history\nwill appear here. Hi."
|
|
|
|
|
w = GSW(nt)
|
|
|
|
|
0 if len(s.hi) else T(
|
|
|
|
|
nt,
|
|
|
|
|
pos=(x + 1285 * sf, s.height-17),
|
|
|
|
|
h_align='center',
|
|
|
|
|
v_align='top',
|
2025-08-10 13:02:22 +00:00
|
|
|
scale=1 if w < (280*sf) else (280*sf)/w
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
cs(sc.DOWN_ARROW),
|
|
|
|
|
pos=(x + 1102 * sf, 10),
|
|
|
|
|
size=(30 * sf, s.height-17),
|
|
|
|
|
disabled=s.ii >= len(s.hi)-3,
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(s.mv, 'ii', 1)
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
cs(sc.UP_ARROW),
|
|
|
|
|
pos=(x + 1436 * sf, 10),
|
|
|
|
|
size=(30 * sf, s.height-17),
|
|
|
|
|
disabled=s.ii <= 0,
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(s.mv, 'ii', -1)
|
2025-08-03 13:53:51 +03:00
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'Force leave',
|
|
|
|
|
call=FORCE,
|
|
|
|
|
pos=(x + 1469 * sf, s.height-34),
|
|
|
|
|
size=(130 * sf, 27),
|
|
|
|
|
label_scale=0.9
|
|
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'Laugh',
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(chat, 'hahaha'),
|
2025-08-03 13:53:51 +03:00
|
|
|
pos=(x + 1469 * sf, s.height-62),
|
|
|
|
|
size=(130 * sf, 27)
|
|
|
|
|
)
|
|
|
|
|
B(
|
|
|
|
|
'Power',
|
2025-08-10 13:02:22 +00:00
|
|
|
call=Call(push, 'Power v2.5 MinUI\nExpand dev console to switch to FullUI. thanks.'),
|
2025-08-03 13:53:51 +03:00
|
|
|
pos=(x + 1469 * sf, s.height-90),
|
|
|
|
|
size=(130 * sf, 27)
|
|
|
|
|
)
|
2025-08-10 13:02:22 +00:00
|
|
|
|
|
|
|
|
def log(s, t):
|
|
|
|
|
s.ls.append((t, NOW()))
|
2025-08-03 13:53:51 +03:00
|
|
|
if s.lii < 99:
|
|
|
|
|
s.lii += 1
|
2025-08-10 13:02:22 +00:00
|
|
|
if s.li == s.lii-17:
|
|
|
|
|
s.li += 1
|
|
|
|
|
else:
|
|
|
|
|
s.ls.pop(0)
|
2025-08-03 13:53:51 +03:00
|
|
|
s.rf()
|
2025-08-10 13:02:22 +00:00
|
|
|
|
|
|
|
|
def mv(s, a, i):
|
|
|
|
|
setattr(s, a, getattr(s, a)+i)
|
2025-08-03 13:53:51 +03:00
|
|
|
s.rf()
|
2025-08-10 13:02:22 +00:00
|
|
|
|
|
|
|
|
def job(s, f, j):
|
2025-08-03 13:53:51 +03:00
|
|
|
s.j = j
|
|
|
|
|
s.lf = f
|
|
|
|
|
s.hd = j[1] if s.j[0] == 'JRejoin' else j[2]
|
|
|
|
|
if f is not None:
|
|
|
|
|
s._job(f)
|
2025-08-10 13:02:22 +00:00
|
|
|
push('Job started', color=(1, 1, 0))
|
|
|
|
|
else:
|
|
|
|
|
push('Job stopped', color=(1, 1, 0))
|
2025-08-03 13:53:51 +03:00
|
|
|
s.rf()
|
2025-08-10 13:02:22 +00:00
|
|
|
|
|
|
|
|
def _job(s, f):
|
|
|
|
|
if f != s.lf:
|
|
|
|
|
return
|
2025-08-03 13:53:51 +03:00
|
|
|
s.log(f'[{s.lii:02}] [{s.j[0]}] {s.hd}')
|
2025-08-10 13:02:22 +00:00
|
|
|
f()
|
|
|
|
|
teck(s.ji or 0.1, Call(s._job, f))
|
|
|
|
|
|
|
|
|
|
def prv(s, c, p, n):
|
|
|
|
|
s.c, s.p, s.n = c, p, n
|
2025-08-03 13:53:51 +03:00
|
|
|
s.rf()
|
2025-08-10 13:02:22 +00:00
|
|
|
|
|
|
|
|
def chk(s, pn):
|
2025-08-03 13:53:51 +03:00
|
|
|
y = 0
|
2025-08-10 13:02:22 +00:00
|
|
|
for n, g in s.rr.items():
|
|
|
|
|
c, p = g
|
|
|
|
|
if n == pn:
|
|
|
|
|
y = 1
|
2025-08-03 13:53:51 +03:00
|
|
|
else:
|
|
|
|
|
for _ in p:
|
2025-08-10 13:02:22 +00:00
|
|
|
if pn in [_['name'], _['name_full']]:
|
|
|
|
|
y = 1
|
|
|
|
|
if y:
|
|
|
|
|
s.prv(c, p, n)
|
|
|
|
|
break
|
|
|
|
|
|
2025-08-03 13:53:51 +03:00
|
|
|
|
|
|
|
|
HAS = app.ui_v1.has_main_window
|
|
|
|
|
SAVE = app.classic.save_ui_state
|
2025-08-10 13:02:22 +00:00
|
|
|
def KICK(f): return DISC(f())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def FORCE(): return teck(0.7 if HAS() else 0.1, lambda: 0 if HAS()
|
|
|
|
|
else app.classic.return_to_main_menu_session_gracefully())
|
|
|
|
|
|
|
|
|
|
|
2025-08-03 13:53:51 +03:00
|
|
|
JOIN = lambda *a: (SAVE() or 1) and CON(*a)
|
2025-08-10 13:02:22 +00:00
|
|
|
def GSW(s): return sw(s, suppress_warning=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def REJOIN(a, p, f): return ((LEAVE() if getattr(HOST(), 'name', '') else 0)
|
|
|
|
|
or 1) and teck(f() or 0.1, Call(JOIN, a, p, False))
|
|
|
|
|
def COPY(s): return ((CST(s) or 1) if CIS() else push(
|
|
|
|
|
'Clipboard not supported!')) and push('Copied!', color=(0, 1, 0))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def NOW(): return DT.now().strftime("%H:%M:%S")
|
2025-08-03 13:53:51 +03:00
|
|
|
|
|
|
|
|
# brobord collide grass
|
|
|
|
|
# ba_meta require api 9
|
|
|
|
|
# ba_meta export babase.Plugin
|
2025-08-10 13:02:22 +00:00
|
|
|
|
|
|
|
|
|
2025-08-03 13:53:51 +03:00
|
|
|
class byBordd(Plugin):
|
|
|
|
|
def __init__(s):
|
|
|
|
|
C = Power
|
|
|
|
|
N = C.__name__
|
2025-08-10 13:02:22 +00:00
|
|
|
E = ENT(N, C)
|
2025-08-03 13:53:51 +03:00
|
|
|
I = app.devconsole
|
|
|
|
|
I.tabs = [_ for _ in I.tabs if _.name != N]+[E]
|
|
|
|
|
I._tab_instances[N] = E.factory()
|