133 lines
3.8 KiB
GDScript
133 lines
3.8 KiB
GDScript
class_name Request
|
|
extends RefCounted
|
|
## Клиентский запрос на отправку файлов.
|
|
##
|
|
## `required` — конкретные id файлов (D01), `attached` — какие из них уже
|
|
## прикреплены. Файл может быть required в нескольких запросах, но attached
|
|
## только в одном (D06). Состояния — флаги D09.
|
|
|
|
var id: String = ""
|
|
var client_name: String = ""
|
|
var client_id: String = ""
|
|
var avatar: String = ""
|
|
var protocol: String = "tcp"
|
|
var required: Array[String] = []
|
|
var attached: Array[String] = []
|
|
var time_left: float = 0.0
|
|
var timer_total: float = 0.0
|
|
|
|
var slot_reserved: bool = false
|
|
var connected: bool = false
|
|
var minigame_active: bool = false
|
|
var sending: bool = false
|
|
|
|
var quality: float = 1.0
|
|
var send_progress: float = 0.0
|
|
var is_attack: bool = false
|
|
var attack_kind: String = ""
|
|
|
|
## Служебные поля, заполняются директором при старте отправки.
|
|
var attack_id: String = ""
|
|
var required_types: Array[String] = []
|
|
var send_duration: float = 0.0
|
|
var send_base_sum: float = 0.0
|
|
|
|
|
|
## Готов ли запрос к отправке: все required прикреплены, TCP подключён.
|
|
func is_ready() -> bool:
|
|
if missing_count() > 0:
|
|
return false
|
|
if protocol.to_lower() == "tcp" and not connected:
|
|
return false
|
|
return true
|
|
|
|
|
|
func missing_count() -> int:
|
|
var missing := 0
|
|
for file_id in required:
|
|
if not attached.has(file_id):
|
|
missing += 1
|
|
return missing
|
|
|
|
|
|
func missing_files() -> Array[String]:
|
|
var out: Array[String] = []
|
|
for file_id in required:
|
|
if not attached.has(file_id):
|
|
out.append(file_id)
|
|
return out
|
|
|
|
|
|
func required_count() -> int:
|
|
return required.size()
|
|
|
|
|
|
func time_ratio() -> float:
|
|
if timer_total <= 0.0:
|
|
return 0.0
|
|
return clampf(time_left / timer_total, 0.0, 1.0)
|
|
|
|
|
|
func is_phishing() -> bool:
|
|
return is_attack and attack_kind == "phishing"
|
|
|
|
|
|
func to_dict() -> Dictionary:
|
|
return {
|
|
"id": id,
|
|
"client_name": client_name,
|
|
"client_id": client_id,
|
|
"avatar": avatar,
|
|
"protocol": protocol,
|
|
"required": required.duplicate(),
|
|
"attached": attached.duplicate(),
|
|
"time_left": time_left,
|
|
"timer_total": timer_total,
|
|
"slot_reserved": slot_reserved,
|
|
"connected": connected,
|
|
"minigame_active": minigame_active,
|
|
"sending": sending,
|
|
"quality": quality,
|
|
"send_progress": send_progress,
|
|
"is_attack": is_attack,
|
|
"attack_kind": attack_kind,
|
|
"attack_id": attack_id,
|
|
"required_types": required_types.duplicate(),
|
|
"send_duration": send_duration,
|
|
"send_base_sum": send_base_sum,
|
|
}
|
|
|
|
|
|
static func from_dict(d: Dictionary):
|
|
var r = new()
|
|
r.id = str(d.get("id", ""))
|
|
r.client_name = str(d.get("client_name", ""))
|
|
r.client_id = str(d.get("client_id", ""))
|
|
r.avatar = str(d.get("avatar", ""))
|
|
r.protocol = str(d.get("protocol", "tcp")).to_lower()
|
|
r.required = _string_array(d.get("required", []))
|
|
r.attached = _string_array(d.get("attached", []))
|
|
r.time_left = float(d.get("time_left", 0.0))
|
|
r.timer_total = float(d.get("timer_total", 0.0))
|
|
r.slot_reserved = bool(d.get("slot_reserved", false))
|
|
r.connected = bool(d.get("connected", false))
|
|
r.minigame_active = bool(d.get("minigame_active", false))
|
|
r.sending = bool(d.get("sending", false))
|
|
r.quality = clampf(float(d.get("quality", 1.0)), 0.0, 1.0)
|
|
r.send_progress = float(d.get("send_progress", 0.0))
|
|
r.is_attack = bool(d.get("is_attack", false))
|
|
r.attack_kind = str(d.get("attack_kind", ""))
|
|
r.attack_id = str(d.get("attack_id", ""))
|
|
r.required_types = _string_array(d.get("required_types", []))
|
|
r.send_duration = float(d.get("send_duration", 0.0))
|
|
r.send_base_sum = float(d.get("send_base_sum", 0.0))
|
|
return r
|
|
|
|
|
|
static func _string_array(value) -> Array[String]:
|
|
var out: Array[String] = []
|
|
if value is Array:
|
|
for item in value:
|
|
out.append(str(item))
|
|
return out
|