commit 719d1628e02ab1bc0d989ddc3327e48c02b66df4 Author: bucket Date: Fri Mar 6 23:35:19 2026 +0100 Initial commit diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..f28239b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,4 @@ +root = true + +[*] +charset = utf-8 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8ad74f7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Normalize EOL for all files that Git considers text files. +* text=auto eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0af181c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +# Godot 4+ specific ignores +.godot/ +/android/ diff --git a/AltShowcase.gd b/AltShowcase.gd new file mode 100644 index 0000000..16e7071 --- /dev/null +++ b/AltShowcase.gd @@ -0,0 +1,6 @@ +class_name altshowcase extends Control + +@export var name_label: Label +@export var uid_label: Label +@export var count_label: Label +@export var search_alts_button: Button diff --git a/AltShowcase.gd.uid b/AltShowcase.gd.uid new file mode 100644 index 0000000..a1f735f --- /dev/null +++ b/AltShowcase.gd.uid @@ -0,0 +1 @@ +uid://2f384phq5272 diff --git a/Minus.png b/Minus.png new file mode 100644 index 0000000..ef62602 Binary files /dev/null and b/Minus.png differ diff --git a/Minus.png.import b/Minus.png.import new file mode 100644 index 0000000..36af7c0 --- /dev/null +++ b/Minus.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c7r26dxgqkklc" +path="res://.godot/imported/Minus.png-fdca73571ee1f51129171a53d22c475c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Minus.png" +dest_files=["res://.godot/imported/Minus.png-fdca73571ee1f51129171a53d22c475c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Plus.png b/Plus.png new file mode 100644 index 0000000..5a95b4b Binary files /dev/null and b/Plus.png differ diff --git a/Plus.png.import b/Plus.png.import new file mode 100644 index 0000000..6e6210d --- /dev/null +++ b/Plus.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dppihj7ptidog" +path="res://.godot/imported/Plus.png-7f0b6e62ef4c9053e1aaeef8ad93a0d8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Plus.png" +dest_files=["res://.godot/imported/Plus.png-7f0b6e62ef4c9053e1aaeef8ad93a0d8.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Punishment.gd b/Punishment.gd new file mode 100644 index 0000000..504db74 --- /dev/null +++ b/Punishment.gd @@ -0,0 +1,10 @@ +class_name Punishment extends Resource + +@export var username:String = "" +@export var uid:String = "" +@export var what_punishment:punishment_types +@export var punish_reason:String = "" +## in unix time, zero means forever +@export var punish_end:int + +enum punishment_types{BAN,MUTE} diff --git a/Punishment.gd.uid b/Punishment.gd.uid new file mode 100644 index 0000000..08cb69e --- /dev/null +++ b/Punishment.gd.uid @@ -0,0 +1 @@ +uid://cafyno407e2uq diff --git a/ban_list_exporter.gd b/ban_list_exporter.gd new file mode 100644 index 0000000..235e80f --- /dev/null +++ b/ban_list_exporter.gd @@ -0,0 +1,32 @@ +class_name BanListExporter extends Node + +func Export(Punishments:Array[Punishment],file:String) -> void: + var fileaccess:FileAccess = FileAccess.open(file,FileAccess.WRITE) + if !fileaccess: + push_error("!fileaccess is true") + return + var content:String = "" + for punishment in Punishments: + if !punishment.username: + continue + content += "NAME: " + punishment.username + "\n" + content += "UID: " + punishment.uid + "\n" + content += "PUNISHMENT: " + ("MUTE" if punishment.what_punishment == + punishment.punishment_types.MUTE else "BAN") + "\n" + content += "REASON: " + punishment.punish_reason + "\n" + content += "END_DATE: " + str(punishment.punish_end) + "\n" + + fileaccess.store_string(content) + +func Exportv1(Punishments:Array[Punishment],file:String) -> void: + var fileaccess:FileAccess = FileAccess.open(file,FileAccess.WRITE) + if !fileaccess: + push_error("!fileaccess is true") + return + var content:String = "" + for punishment in Punishments: + if !punishment.username: + continue + content += "NAME: " + punishment.username + "\n" + content += "UID: " + punishment.uid + "\n" + fileaccess.store_string(content) diff --git a/ban_list_exporter.gd.uid b/ban_list_exporter.gd.uid new file mode 100644 index 0000000..d5943fb --- /dev/null +++ b/ban_list_exporter.gd.uid @@ -0,0 +1 @@ +uid://caaljvxo8tja5 diff --git a/door.png b/door.png new file mode 100644 index 0000000..fd636d1 Binary files /dev/null and b/door.png differ diff --git a/door.png.import b/door.png.import new file mode 100644 index 0000000..e5a41fc --- /dev/null +++ b/door.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cinbmowbp2btd" +path="res://.godot/imported/door.png-4ad4ab0c545155655bbef277d86eb152.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://door.png" +dest_files=["res://.godot/imported/door.png-4ad4ab0c545155655bbef277d86eb152.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/export_presets.cfg b/export_presets.cfg new file mode 100644 index 0000000..e000402 --- /dev/null +++ b/export_presets.cfg @@ -0,0 +1,74 @@ +[preset.0] + +name="Windows Desktop" +platform="Windows Desktop" +runnable=true +dedicated_server=false +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="../BanBanWindows/BanListEditor.exe" +patches=PackedStringArray() +patch_delta_encoding=false +patch_delta_compression_level_zstd=19 +patch_delta_min_reduction=0.1 +patch_delta_include_filters="*" +patch_delta_exclude_filters="" +encryption_include_filters="" +encryption_exclude_filters="" +seed=0 +encrypt_pck=false +encrypt_directory=false +script_export_mode=2 + +[preset.0.options] + +custom_template/debug="" +custom_template/release="" +debug/export_console_wrapper=1 +binary_format/embed_pck=true +texture_format/s3tc_bptc=true +texture_format/etc2_astc=false +shader_baker/enabled=false +binary_format/architecture="x86_64" +codesign/enable=false +codesign/timestamp=true +codesign/timestamp_server_url="" +codesign/digest_algorithm=1 +codesign/description="" +codesign/custom_options=PackedStringArray() +application/modify_resources=true +application/icon="" +application/console_wrapper_icon="" +application/icon_interpolation=4 +application/file_version="" +application/product_version="" +application/company_name="" +application/product_name="" +application/file_description="" +application/copyright="" +application/trademarks="" +application/export_angle=0 +application/export_d3d12=0 +application/d3d12_agility_sdk_multiarch=true +ssh_remote_deploy/enabled=false +ssh_remote_deploy/host="user@host_ip" +ssh_remote_deploy/port="22" +ssh_remote_deploy/extra_args_ssh="" +ssh_remote_deploy/extra_args_scp="" +ssh_remote_deploy/run_script="Expand-Archive -LiteralPath '{temp_dir}\\{archive_name}' -DestinationPath '{temp_dir}' +$action = New-ScheduledTaskAction -Execute '{temp_dir}\\{exe_name}' -Argument '{cmd_args}' +$trigger = New-ScheduledTaskTrigger -Once -At 00:00 +$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries +$task = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings +Register-ScheduledTask godot_remote_debug -InputObject $task -Force:$true +Start-ScheduledTask -TaskName godot_remote_debug +while (Get-ScheduledTask -TaskName godot_remote_debug | ? State -eq running) { Start-Sleep -Milliseconds 100 } +Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue" +ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue +Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue +Remove-Item -Recurse -Force '{temp_dir}'" +dotnet/include_scripts_content=false +dotnet/include_debug_symbols=true +dotnet/embed_build_outputs=false diff --git a/icon.svg b/icon.svg new file mode 100644 index 0000000..c6bbb7d --- /dev/null +++ b/icon.svg @@ -0,0 +1 @@ + diff --git a/icon.svg.import b/icon.svg.import new file mode 100644 index 0000000..d8ce45d --- /dev/null +++ b/icon.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bf1hiirahdgrf" +path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.svg" +dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/main.gd b/main.gd new file mode 100644 index 0000000..230ccb2 --- /dev/null +++ b/main.gd @@ -0,0 +1,182 @@ +class_name mainNode extends Control +@export var edit_window:EditWindow +@export var punish_list_parser: PunishListParser +@export var PunishContainer:Control +@export var punish_scene:PackedScene +@export var new_punish_btn:Button +@export var file_opener:FileDialog +@export var open_btn:Button +@export var new_btn:Button +@export var save_btn:Button +@export var exporter:BanListExporter +@export var file_label:Label +@export var save_file_parser:SaveFileParser +@export var quit_confirmation:ConfirmationDialog +@export var ban_counter: Label +@export var save_label: Label +@export var plus: CPUParticles2D +@export var minus: CPUParticles2D +@export var more_btn: Button +@export var options_window: MoreOptionsWindow + +var current_path:String +var unsaved:bool + +func _ready() -> void: + more_btn.pressed.connect(options_window.show) + edit_window.changed.connect(update_ban_counter) # use as update + + quit_confirmation.canceled.connect(get_tree().quit) + quit_confirmation.confirmed.connect(save_and_exit) + get_tree().auto_accept_quit = false + get_tree().root.close_requested.connect(close_request) + set_file(save_file_parser.read()) + file_opener.file_selected.connect(set_file) + open_btn.pressed.connect(file_opener.show) + new_btn.pressed.connect(new_punishment) + save_btn.pressed.connect(save) + options_window.remove_dupes.connect(remove_dupes) + options_window.save_v_one.connect(savevone) + +func savevone(): + var Punishments:Array[Punishment] + for child in PunishContainer.get_children(): + if child is PunishShowcase: + Punishments.append(child.punishment) + exporter.Exportv1(Punishments,current_path.rstrip(".txt")+" v1.txt") + +func _process(_delta: float) -> void: + if Input.is_action_just_pressed("save"): + save() + +var last_alts:int = 0 +func remove_dupes(): + unsaved = true + remove_loop() + update_ban_counter() + +func remove_loop(): + var found:bool = remove_iteration() + if found == true: + remove_loop() + +func remove_iteration() -> bool: + var punishments:Array[PunishShowcase] + for child in PunishContainer.get_children(): + if child is PunishShowcase: + punishments.append(child) + for punishment_keep in punishments: + for punishment_two in punishments: + # cancel if not same name + if punishment_keep == punishment_two: + continue + if punishment_keep.punishment.username != punishment_two.punishment.username: + continue + # cancel if not same uid + if punishment_keep.punishment.uid != punishment_two.punishment.uid: + continue + # if there a reason? + if punishment_keep.punishment.punish_reason == "": + punishment_keep.punishment.punish_reason = punishment_two.punishment.punish_reason + # is there a time set? + if punishment_keep.punishment.punish_end == 0: + punishment_keep.punishment.punish_end = punishment_two.punishment.punish_end + # if its a mute maybe it should be a ban + if punishment_keep.punishment.what_punishment == Punishment.punishment_types.MUTE: + punishment_keep.punishment.what_punishment = punishment_two.punishment.what_punishment + + punishment_two.free() + return true + return false + + +func update_ban_counter(): + var punishments:Array[Punishment] + for child in PunishContainer.get_children(): + if child is PunishShowcase: + punishments.append(child.punishment) + var count:int = 0 + var keys:Array[String] + for punishment in punishments: + if punishment.uid != "": + if !keys.has(punishment.uid): + keys.append(punishment.uid) + count += 1 + else: + if !keys.has(punishment.username): + keys.append(punishment.username) + count += 1 + ban_counter.text = str(punishments.size()) + " Entires :::::: " + str(count) + \ + " Unique :::::: " + str(punishments.size()-count) + " Alts" + var alts = punishments.size() - count + if last_alts != alts: + if alts > last_alts: + plus.emitting = true + else: + minus.emitting = true + last_alts = alts + +func save(): + save_label.hide() + var Punishments:Array[Punishment] + for child in PunishContainer.get_children(): + if child is PunishShowcase: + Punishments.append(child.punishment) + update_ban_counter() + save_file_parser.save(current_path) + exporter.Export(Punishments,current_path) + unsaved = false + +func new_punishment() -> void: + unsaved = true + save_label.show() + var child:PunishShowcase = punish_scene.instantiate() + child.punishment = Punishment.new() + PunishContainer.add_child(child) + child.update() + child.Edit.connect(edit_called) + edit_called(child,true) + update_ban_counter() + +func add_punishments(file:String): + save_label.show() + var punishments = punish_list_parser.parse(file) + for punish:Punishment in punishments: + var child:PunishShowcase = punish_scene.instantiate() + child.punishment = punish + PunishContainer.add_child(child) + child.update() + child.Edit.connect(edit_called) + update_ban_counter() + +func clear_children(): + save_label.hide() + for child in PunishContainer.get_children(): + child.queue_free() + update_ban_counter() + +func edit_called(on:PunishShowcase,set_time:bool = false): + save_label.show() + unsaved = true + edit_window.opened_from = on + edit_window.punishment = on.punishment if on else Punishment.new() + edit_window.update(set_time) + edit_window.show() + edit_window.grab_focus() + update_ban_counter() + +func set_file(path:String): + current_path = path + file_label.text = path + clear_children() + add_punishments(path) + +func close_request(): + if !unsaved: + get_tree().quit() + else: + quit_confirmation.show() + +func save_and_exit(): + save() + get_tree().quit() diff --git a/main.gd.uid b/main.gd.uid new file mode 100644 index 0000000..6e4a74b --- /dev/null +++ b/main.gd.uid @@ -0,0 +1 @@ +uid://c57yqopmolu8o diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..85d70dc --- /dev/null +++ b/project.godot @@ -0,0 +1,34 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="BanListEditor" +run/main_scene="uid://cxf3yenlgvupj" +config/features=PackedStringArray("4.7", "GL Compatibility") +config/icon="res://icon.svg" + +[dotnet] + +project/assembly_name="BanListEditor" + +[input] + +save={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":true,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null) +] +} + +[rendering] + +renderer/rendering_method="gl_compatibility" +renderer/rendering_method.mobile="gl_compatibility" +textures/vram_compression/import_etc2_astc=true diff --git a/punish_list_parser.gd b/punish_list_parser.gd new file mode 100644 index 0000000..bc7ce57 --- /dev/null +++ b/punish_list_parser.gd @@ -0,0 +1,44 @@ +class_name PunishListParser extends Node + +func parse(file:String) -> Array[Punishment]: + if !file: + return [] + var fileaccess:FileAccess = FileAccess.open(file,FileAccess.READ) + if fileaccess == null: + printerr("no access to file: fileaccess == null") + return [] + var raw:String = fileaccess.get_as_text() + var lines:PackedStringArray = raw.split("\n") + var punishments:Array[Punishment] + for line in lines: + print("line ",line) + var splits:PackedStringArray = line.split(": ") + match splits[0]: + "L!ListBegin": + print("start") + "NAME": + var new_punish:Punishment = Punishment.new() + new_punish.username = splits[1] + punishments.append(new_punish) + "UID": + punishments[-1].uid = splits[1] + "PUNISHMENT": + var punish:Punishment.punishment_types = punish_text_to_enum(splits[1]) + punishments[-1].what_punishment = punish + "REASON": + punishments[-1].punish_reason = splits[1] + "END_DATE": + punishments[-1].punish_end = splits[1].to_int() + "L!ListEnd": + break + + return punishments + +func punish_text_to_enum(text) -> Punishment.punishment_types: + var punish:Punishment.punishment_types + match text: + "BAN": + punish = Punishment.punishment_types.BAN + "MUTE": + punish = Punishment.punishment_types.MUTE + return punish diff --git a/punish_list_parser.gd.uid b/punish_list_parser.gd.uid new file mode 100644 index 0000000..1227bcd --- /dev/null +++ b/punish_list_parser.gd.uid @@ -0,0 +1 @@ +uid://c5ihhdkosauvw diff --git a/save_file_parser.gd b/save_file_parser.gd new file mode 100644 index 0000000..0248a4b --- /dev/null +++ b/save_file_parser.gd @@ -0,0 +1,18 @@ +class_name SaveFileParser extends Node + +const savloc = "user://save.dat" + +func read() -> String: + var file = FileAccess.open(savloc,FileAccess.READ) + if !file: + print("no savefile found") + return "" + + return file.get_as_text() + +func save(current_file:String) -> void: + var file = FileAccess.open(savloc,FileAccess.WRITE) + if !file: + push_error("cant write savefile") + return + file.store_string(current_file) diff --git a/save_file_parser.gd.uid b/save_file_parser.gd.uid new file mode 100644 index 0000000..f481733 --- /dev/null +++ b/save_file_parser.gd.uid @@ -0,0 +1 @@ +uid://3gmapu83dglo diff --git a/scenes/Main.tscn b/scenes/Main.tscn new file mode 100644 index 0000000..4e99d21 --- /dev/null +++ b/scenes/Main.tscn @@ -0,0 +1,244 @@ +[gd_scene format=3 uid="uid://cxf3yenlgvupj"] + +[ext_resource type="Script" uid="uid://c57yqopmolu8o" path="res://main.gd" id="1_bjd11"] +[ext_resource type="PackedScene" uid="uid://bxpr2nb1hydpi" path="res://scenes/punish_showcase.tscn" id="2_qmy6f"] +[ext_resource type="Texture2D" uid="uid://o2sjogt3b0ht" path="res://tf2logo.png" id="3_mwfav"] +[ext_resource type="Texture2D" uid="uid://dppihj7ptidog" path="res://Plus.png" id="4_3p2gp"] +[ext_resource type="Texture2D" uid="uid://c7r26dxgqkklc" path="res://Minus.png" id="5_cvmbd"] +[ext_resource type="Script" uid="uid://c5ihhdkosauvw" path="res://punish_list_parser.gd" id="6_ft6cd"] +[ext_resource type="Script" uid="uid://caaljvxo8tja5" path="res://ban_list_exporter.gd" id="7_bb450"] +[ext_resource type="PackedScene" uid="uid://dy18m2uq557to" path="res://scenes/windwos/edit_window.tscn" id="8_nfivy"] +[ext_resource type="PackedScene" uid="uid://burukk5374yyu" path="res://scenes/windwos/MoreOptionsWindow.tscn" id="9_1nqs0"] +[ext_resource type="PackedScene" uid="uid://gah2g6nabyf4" path="res://scenes/windwos/statistics.tscn" id="10_1iba3"] +[ext_resource type="Script" uid="uid://bt5wd8qjaevk0" path="res://search.gd" id="11_yxlcp"] +[ext_resource type="Script" uid="uid://3gmapu83dglo" path="res://save_file_parser.gd" id="12_ebg2g"] + +[sub_resource type="LabelSettings" id="LabelSettings_lgr22"] +font_size = 26 +outline_size = 11 +outline_color = Color(0, 0, 0, 1) +shadow_size = 11 +shadow_color = Color(0, 0, 0, 0.3254902) +shadow_offset = Vector2(12.105, 8.315) +stacked_outline_count = 3 +stacked_outline_0/size = 4 +stacked_outline_0/color = Color(1, 0, 0, 1) +stacked_outline_1/size = 4 +stacked_outline_1/color = Color(0.8099345, 0.9946762, 7.70092e-07, 1) +stacked_outline_2/size = 4 +stacked_outline_2/color = Color(0.32855865, 0.41260794, 1, 1) + +[node name="Control" type="Control" unique_id=2276929 node_paths=PackedStringArray("edit_window", "punish_list_parser", "PunishContainer", "new_punish_btn", "file_opener", "open_btn", "new_btn", "save_btn", "exporter", "file_label", "save_file_parser", "quit_confirmation", "ban_counter", "save_label", "plus", "minus", "more_btn", "options_window")] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_bjd11") +edit_window = NodePath("EditWindow") +punish_list_parser = NodePath("BanListParser") +PunishContainer = NodePath("MarginContainer/VBoxContainer/ScrollContainer/Tree") +punish_scene = ExtResource("2_qmy6f") +new_punish_btn = NodePath("MarginContainer/VBoxContainer/HBoxContainer/Punish") +file_opener = NodePath("OpenFile") +open_btn = NodePath("MarginContainer/VBoxContainer/HBoxContainer2/OpenFileBtn") +new_btn = NodePath("MarginContainer/VBoxContainer/HBoxContainer/Punish") +save_btn = NodePath("MarginContainer/VBoxContainer/HBoxContainer2/SaveBtn") +exporter = NodePath("BanListExporter") +file_label = NodePath("MarginContainer/VBoxContainer/HBoxContainer2/CurrentFile") +save_file_parser = NodePath("SaveFileParser") +quit_confirmation = NodePath("ConfirmationDialog") +ban_counter = NodePath("MarginContainer/VBoxContainer/HBoxContainer/BanCounter") +save_label = NodePath("MarginContainer/VBoxContainer/HBoxContainer2/SaveLabel") +plus = NodePath("MarginContainer/VBoxContainer/HBoxContainer/BanCounter/Plus") +minus = NodePath("MarginContainer/VBoxContainer/HBoxContainer/BanCounter/Minus") +more_btn = NodePath("MarginContainer/VBoxContainer/HBoxContainer/More") +options_window = NodePath("OptionsWindow") + +[node name="TextureRect" type="TextureRect" parent="." unique_id=1516457942] +modulate = Color(0.74558026, 0.7455802, 0.7455802, 1) +z_index = -1 +layout_mode = 1 +anchors_preset = -1 +offset_left = -119.0 +offset_top = -214.0 +offset_right = 405.0 +offset_bottom = 526.0 +texture = ExtResource("3_mwfav") +expand_mode = 5 +stretch_mode = 5 + +[node name="ColorRect" type="ColorRect" parent="." unique_id=1789999219] +z_index = -2 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0.32993424, 0.25434008, 0.17645565, 1) + +[node name="MarginContainer" type="MarginContainer" parent="." unique_id=1863119132] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 5 +theme_override_constants/margin_top = 5 +theme_override_constants/margin_right = 5 +theme_override_constants/margin_bottom = 5 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer" unique_id=1186401858] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="HBoxContainer" type="FlowContainer" parent="MarginContainer/VBoxContainer" unique_id=550324332] +layout_mode = 2 + +[node name="Label" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer" unique_id=388690639] +layout_mode = 2 +size_flags_horizontal = 3 +text = "TFVR punishlist maker 2000™" +label_settings = SubResource("LabelSettings_lgr22") + +[node name="BanCounter" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer" unique_id=589605427] +layout_mode = 2 +text = "Unique Bans: " + +[node name="Plus" type="CPUParticles2D" parent="MarginContainer/VBoxContainer/HBoxContainer/BanCounter" unique_id=93983186] +position = Vector2(76, 8) +emitting = false +texture = ExtResource("4_3p2gp") +lifetime = 3.9 +one_shot = true +explosiveness = 1.0 +emission_shape = 1 +emission_sphere_radius = 7.85 +spread = 180.0 +initial_velocity_min = 0.8 +initial_velocity_max = 74.87 + +[node name="Minus" type="CPUParticles2D" parent="MarginContainer/VBoxContainer/HBoxContainer/BanCounter" unique_id=2092945034] +position = Vector2(76, 8) +emitting = false +amount = 3 +texture = ExtResource("5_cvmbd") +lifetime = 3.9 +one_shot = true +explosiveness = 1.0 +emission_shape = 1 +emission_sphere_radius = 7.85 +spread = 180.0 +initial_velocity_min = 0.8 +initial_velocity_max = 74.87 + +[node name="Punish" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer" unique_id=100050923] +layout_mode = 2 +size_flags_horizontal = 8 +text = "new punishment" + +[node name="Stats" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer" unique_id=1256562107] +layout_mode = 2 +size_flags_horizontal = 8 +text = "Stats" + +[node name="More" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer" unique_id=804757173] +layout_mode = 2 +size_flags_horizontal = 8 +text = "More" + +[node name="SearchBar" type="LineEdit" parent="MarginContainer/VBoxContainer" unique_id=2022677611] +layout_mode = 2 +placeholder_text = "Search..." + +[node name="HSeparator" type="HSeparator" parent="MarginContainer/VBoxContainer" unique_id=1970903622] +layout_mode = 2 + +[node name="ScrollContainer" type="ScrollContainer" parent="MarginContainer/VBoxContainer" unique_id=1423908622] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Tree" type="VBoxContainer" parent="MarginContainer/VBoxContainer/ScrollContainer" unique_id=200799914] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="HSeparator2" type="HSeparator" parent="MarginContainer/VBoxContainer" unique_id=1677426181] +layout_mode = 2 + +[node name="HBoxContainer2" type="FlowContainer" parent="MarginContainer/VBoxContainer" unique_id=1760266968] +layout_mode = 2 +alignment = 2 +last_wrap_alignment = 2 + +[node name="OpenFileBtn" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer2" unique_id=1707347790] +layout_mode = 2 +text = "Open file" + +[node name="CurrentFile" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer2" unique_id=1158273656] +layout_mode = 2 +size_flags_horizontal = 3 +text = "no file selected" +clip_text = true +text_overrun_behavior = 1 + +[node name="SaveLabel" type="Label" parent="MarginContainer/VBoxContainer/HBoxContainer2" unique_id=1042352785] +visible = false +layout_mode = 2 +text = "*" + +[node name="SaveBtn" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer2" unique_id=1041770707] +layout_mode = 2 +text = "Save changes" + +[node name="BanListParser" type="Node" parent="." unique_id=951623750] +script = ExtResource("6_ft6cd") + +[node name="BanListExporter" type="Node" parent="." unique_id=1531169139] +script = ExtResource("7_bb450") + +[node name="EditWindow" parent="." unique_id=211137631 instance=ExtResource("8_nfivy")] + +[node name="OptionsWindow" parent="." unique_id=1485451151 instance=ExtResource("9_1nqs0")] +initial_position = 4 + +[node name="Statistics" parent="." unique_id=1932979201 node_paths=PackedStringArray("root", "PunishContainer", "search_bar") instance=ExtResource("10_1iba3")] +root = NodePath("..") +PunishContainer = NodePath("../MarginContainer/VBoxContainer/ScrollContainer/Tree") +search_bar = NodePath("../MarginContainer/VBoxContainer/SearchBar") + +[node name="Search" type="Node" parent="." unique_id=170590161 node_paths=PackedStringArray("search_bar", "punish_container")] +script = ExtResource("11_yxlcp") +search_bar = NodePath("../MarginContainer/VBoxContainer/SearchBar") +punish_container = NodePath("../MarginContainer/VBoxContainer/ScrollContainer/Tree") + +[node name="OpenFile" type="FileDialog" parent="." unique_id=1378168421] +oversampling_override = 1.0 +title = "Open a File" +size = Vector2i(807, 360) +file_mode = 0 +access = 2 +filters = PackedStringArray("*.txt", "*.dat") +use_native_dialog = true + +[node name="SaveFileParser" type="Node" parent="." unique_id=930223611] +script = ExtResource("12_ebg2g") + +[node name="ConfirmationDialog" type="ConfirmationDialog" parent="." unique_id=416398003] +oversampling_override = 1.0 +initial_position = 4 +size = Vector2i(305, 100) +always_on_top = true +force_native = true +ok_button_text = "Save and quit" +dialog_text = "You have unsaved changes!" +cancel_button_text = "Quit without saving" + +[connection signal="pressed" from="MarginContainer/VBoxContainer/HBoxContainer/Stats" to="Statistics" method="grab_focus"] +[connection signal="pressed" from="MarginContainer/VBoxContainer/HBoxContainer/Stats" to="Statistics" method="show"] +[connection signal="pressed" from="MarginContainer/VBoxContainer/HBoxContainer/More" to="OptionsWindow" method="grab_focus"] diff --git a/scenes/punish_showcase.gd b/scenes/punish_showcase.gd new file mode 100644 index 0000000..bb46a33 --- /dev/null +++ b/scenes/punish_showcase.gd @@ -0,0 +1,26 @@ +class_name PunishShowcase extends Control +@onready var name_label: Label = $Container/VBoxContainer/Name +@onready var uid_label: Label = $Container/VBoxContainer/UID +@onready var edit_button: Button = $Container/Edit +@onready var punishment_type_display: TextureRect = $Container/PunishmentTypeDisplay +@onready var container: FlowContainer = $Container +@export var punishment:Punishment + +signal Edit(showcase:PunishShowcase) + +func _ready() -> void: + edit_button.pressed.connect(edit) + if !punishment: + punishment = Punishment.new() + +func update() -> void: + name_label.text = punishment.username + uid_label.text = punishment.uid + punishment_type_display.texture = load("res://door.png") if \ + punishment.what_punishment == punishment.punishment_types.BAN else load("res://speaker.png") + +func edit(): + Edit.emit(self) + +func _process(delta: float) -> void: + custom_minimum_size.y = container.size.y diff --git a/scenes/punish_showcase.gd.uid b/scenes/punish_showcase.gd.uid new file mode 100644 index 0000000..e14dfe1 --- /dev/null +++ b/scenes/punish_showcase.gd.uid @@ -0,0 +1 @@ +uid://dxlkscqs0wpo6 diff --git a/scenes/punish_showcase.tscn b/scenes/punish_showcase.tscn new file mode 100644 index 0000000..b75997d --- /dev/null +++ b/scenes/punish_showcase.tscn @@ -0,0 +1,71 @@ +[gd_scene format=3 uid="uid://bxpr2nb1hydpi"] + +[ext_resource type="Script" uid="uid://dxlkscqs0wpo6" path="res://scenes/punish_showcase.gd" id="1_3wpqj"] +[ext_resource type="Script" uid="uid://cafyno407e2uq" path="res://Punishment.gd" id="2_j4kex"] +[ext_resource type="Texture2D" uid="uid://cinbmowbp2btd" path="res://door.png" id="3_lw8i6"] + +[sub_resource type="Resource" id="Resource_j4kex"] +script = ExtResource("2_j4kex") +metadata/_custom_type_script = "uid://cafyno407e2uq" + +[sub_resource type="LabelSettings" id="LabelSettings_lw8i6"] +font_size = 20 +outline_color = Color(0, 0, 0, 1) +shadow_size = 8 +shadow_color = Color(0, 0, 0, 0.54509807) +shadow_offset = Vector2(1.31, 1.925) + +[sub_resource type="LabelSettings" id="LabelSettings_j4kex"] +font_color = Color(0.68307734, 0.6830774, 0.68307734, 1) + +[node name="PunishShowcase" type="Control" unique_id=1878310580] +custom_minimum_size = Vector2(0, 59) +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_right = -717.0 +offset_bottom = -589.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_3wpqj") +punishment = SubResource("Resource_j4kex") + +[node name="ColorRect" type="ColorRect" parent="." unique_id=1592063175] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0.2509804, 0.2509804, 0.2509804, 0.4862745) + +[node name="Container" type="FlowContainer" parent="." unique_id=818336029] +layout_mode = 1 +anchors_preset = -1 +anchor_right = 1.0 +offset_bottom = 55.0 +grow_horizontal = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="Container" unique_id=2062889465] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="Name" type="Label" parent="Container/VBoxContainer" unique_id=1768649764] +layout_mode = 2 +text = "NAME" +label_settings = SubResource("LabelSettings_lw8i6") + +[node name="UID" type="Label" parent="Container/VBoxContainer" unique_id=323779410] +layout_mode = 2 +text = "UID" +label_settings = SubResource("LabelSettings_j4kex") + +[node name="PunishmentTypeDisplay" type="TextureRect" parent="Container" unique_id=1037680772] +layout_mode = 2 +texture = ExtResource("3_lw8i6") +expand_mode = 2 + +[node name="Edit" type="Button" parent="Container" unique_id=31447788] +layout_mode = 2 +text = "More / Edit" diff --git a/scenes/windwos/MoreOptionsWindow.tscn b/scenes/windwos/MoreOptionsWindow.tscn new file mode 100644 index 0000000..008b68d --- /dev/null +++ b/scenes/windwos/MoreOptionsWindow.tscn @@ -0,0 +1,66 @@ +[gd_scene format=3 uid="uid://burukk5374yyu"] + +[ext_resource type="Script" uid="uid://cgr5yq35l0u65" path="res://scenes/windwos/more_options_window.gd" id="1_5xt3b"] + +[sub_resource type="LabelSettings" id="LabelSettings_5xt3b"] +font_size = 30 + +[node name="OptionsWindow" type="Window" unique_id=1485451151 node_paths=PackedStringArray("dupe_clear_button", "save_v_1_button")] +oversampling_override = 1.0 +position = Vector2i(0, 36) +size = Vector2i(300, 200) +visible = false +force_native = true +min_size = Vector2i(262, 199) +script = ExtResource("1_5xt3b") +dupe_clear_button = NodePath("MarginContainer/ScrollContainer/BoxContainer/DupeClearButton") +save_v_1_button = NodePath("MarginContainer/ScrollContainer/BoxContainer/SaveV1Button") + +[node name="ColorRect" type="ColorRect" parent="." unique_id=1724009282] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +color = Color(0.32941177, 0.25490198, 0.1764706, 1) + +[node name="MarginContainer" type="MarginContainer" parent="." unique_id=782458598] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_constants/margin_left = 5 +theme_override_constants/margin_top = 5 +theme_override_constants/margin_right = 5 +theme_override_constants/margin_bottom = 5 + +[node name="ScrollContainer" type="ScrollContainer" parent="MarginContainer" unique_id=1444604018] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +horizontal_scroll_mode = 0 + +[node name="BoxContainer" type="BoxContainer" parent="MarginContainer/ScrollContainer" unique_id=1819150398] +layout_mode = 2 +size_flags_horizontal = 3 +vertical = true + +[node name="RichTextLabel" type="Label" parent="MarginContainer/ScrollContainer/BoxContainer" unique_id=66906023] +layout_mode = 2 +text = "Utility" +label_settings = SubResource("LabelSettings_5xt3b") + +[node name="DupeClearButton" type="Button" parent="MarginContainer/ScrollContainer/BoxContainer" unique_id=25275652] +layout_mode = 2 +tooltip_text = "Removes duplicate entires(same uid and name)" +text = "Clear Dupes" + +[node name="SaveV1Button" type="Button" parent="MarginContainer/ScrollContainer/BoxContainer" unique_id=1718864258] +layout_mode = 2 +tooltip_text = "Save a version of the banlist in the legacy format" +text = "save duplicate v1 file" diff --git a/scenes/windwos/StatisticsWindow.gd b/scenes/windwos/StatisticsWindow.gd new file mode 100644 index 0000000..656454b --- /dev/null +++ b/scenes/windwos/StatisticsWindow.gd @@ -0,0 +1,89 @@ +extends Window + +@export var root:mainNode +@export var PunishContainer:Control +@export var search_bar:LineEdit +@export var total: Label +@export var alts: Label +@export var unique: Label +@export var best: Label +@export var altshowcse: PackedScene +@export var altshowcse_container: Control + + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + visibility_changed.connect(update_stats) + update_stats() + close_requested.connect(hide) + root.edit_window.changed.connect(update_stats) + +func update_stats(): + for child in altshowcse_container.get_children(): + child.queue_free() + var punishments:Array[Punishment] + for child in PunishContainer.get_children(): + if child is PunishShowcase: + punishments.append(child.punishment) + var count:int = 0 + var keys:Array[String] + for punishment in punishments: + if punishment.uid != "": + if !keys.has(punishment.uid): + keys.append(punishment.uid) + count += 1 + else: + if !keys.has(punishment.username): + keys.append(punishment.username) + count += 1 + var entires_stats:Dictionary[Punishment,int] + for punishment in punishments: + if punishment.uid: + for punishment2 in punishments: + if punishment2 != punishment: + if punishment2.uid == punishment.uid: + if entires_stats.has(punishment): + entires_stats[punishment] += 1 + else: + entires_stats[punishment] = 1 + var most_evader:Punishment + var most_alts:int = -1 + var used_uids:Array[String] = [] + sort_dict(entires_stats) + for entry in entires_stats.keys(): + if entires_stats[entry] > most_alts: + print("new best: ",entires_stats[entry] ) + most_evader = entry + most_alts = entires_stats[entry] + + + if entry is Punishment: + if entry.uid not in used_uids: + used_uids.append(entry.uid) + var child:altshowcase = altshowcse.instantiate() + altshowcse_container.add_child(child) + child.count_label.text = "%s alts" % entires_stats[entry] + child.name_label.text = entry.username + child.uid_label.text = entry.uid + child.search_alts_button.pressed.connect(root_search.bind(child.uid_label.text)) + total.text = "Total punishments %s" % str(punishments.size()) + unique.text = "Unique people: %s" % str(count) + alts.text = "Alts total: %s" % str(punishments.size()-count) + if most_evader: + best.text = "Most alt accounts: %s (%s)" % [most_evader.username, most_evader.uid] + +func root_search(what:String): + search_bar.text = what + search_bar.text_changed.emit(what) + +func sort_dict(dict: Dictionary) -> void: + var pairs = dict.keys().map(func (key): return [key, dict[key]]) + pairs.sort() + pairs.reverse() + dict.clear() + for p in pairs: + dict[p[0]] = p[1] + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + pass diff --git a/scenes/windwos/StatisticsWindow.gd.uid b/scenes/windwos/StatisticsWindow.gd.uid new file mode 100644 index 0000000..db606ae --- /dev/null +++ b/scenes/windwos/StatisticsWindow.gd.uid @@ -0,0 +1 @@ +uid://dwc8m0l6he4uo diff --git a/scenes/windwos/altshowcse.tscn b/scenes/windwos/altshowcse.tscn new file mode 100644 index 0000000..8efa6f9 --- /dev/null +++ b/scenes/windwos/altshowcse.tscn @@ -0,0 +1,62 @@ +[gd_scene format=3 uid="uid://bv4mvou68l2sk"] + +[ext_resource type="Script" uid="uid://2f384phq5272" path="res://AltShowcase.gd" id="1_7tuyd"] + +[sub_resource type="LabelSettings" id="LabelSettings_7tuyd"] +font_size = 20 + +[sub_resource type="LabelSettings" id="LabelSettings_45q1g"] +font_size = 15 +font_color = Color(0.74558026, 0.7455802, 0.7455802, 1) + +[sub_resource type="LabelSettings" id="LabelSettings_y1bem"] +font_size = 27 + +[node name="Altshowcase" type="Control" unique_id=96967418 node_paths=PackedStringArray("name_label", "uid_label", "count_label", "search_alts_button")] +custom_minimum_size = Vector2(0, 58.235) +layout_mode = 3 +anchors_preset = 10 +anchor_right = 1.0 +grow_horizontal = 2 +size_flags_horizontal = 3 +script = ExtResource("1_7tuyd") +name_label = NodePath("HBoxContainer/VBoxContainer/Name") +uid_label = NodePath("HBoxContainer/VBoxContainer/Uid") +count_label = NodePath("HBoxContainer/Count") +search_alts_button = NodePath("HBoxContainer/SearchAltsButton") + +[node name="ColorRect" type="ColorRect" parent="." unique_id=2074909687] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0, 0, 0, 0.13333334) + +[node name="HBoxContainer" type="HBoxContainer" parent="." unique_id=809192798] +layout_mode = 0 +offset_right = 40.0 +offset_bottom = 40.0 + +[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer" unique_id=166743843] +layout_mode = 2 + +[node name="Name" type="Label" parent="HBoxContainer/VBoxContainer" unique_id=1070838197] +layout_mode = 2 +text = "name" +label_settings = SubResource("LabelSettings_7tuyd") + +[node name="Uid" type="Label" parent="HBoxContainer/VBoxContainer" unique_id=718203878] +layout_mode = 2 +text = "UID" +label_settings = SubResource("LabelSettings_45q1g") + +[node name="Count" type="Label" parent="HBoxContainer" unique_id=899914138] +layout_mode = 2 +text = "67 alts" +label_settings = SubResource("LabelSettings_y1bem") + +[node name="SearchAltsButton" type="Button" parent="HBoxContainer" unique_id=957758160] +layout_mode = 2 +text = "Show" diff --git a/scenes/windwos/edit_window.gd b/scenes/windwos/edit_window.gd new file mode 100644 index 0000000..5d5ca94 --- /dev/null +++ b/scenes/windwos/edit_window.gd @@ -0,0 +1,86 @@ +class_name EditWindow extends Window +@onready var days_edit: SpinBox = $margin/VBoxContainer/ScrollContainer/Container/Ends/DaysEdit +@onready var years_edit: SpinBox = $margin/VBoxContainer/ScrollContainer/Container/Ends/YearsEdit +@onready var reason_edit: LineEdit = $"margin/VBoxContainer/ScrollContainer/Container/Reason/Reason Edit" +@onready var uid_edit: LineEdit = $"margin/VBoxContainer/ScrollContainer/Container/UID/UID Edit" +@onready var name_edit: LineEdit = $"margin/VBoxContainer/ScrollContainer/Container/Name/Name Edit" +@onready var donebutton: Button = $margin/VBoxContainer/Done +@onready var delete_check: CheckBox = $margin/VBoxContainer/ScrollContainer/Container/DeleteCheck +@onready var delete_button: Button = $margin/VBoxContainer/ScrollContainer/Container/DeleteButton +@onready var type_button: OptionButton = $margin/VBoxContainer/ScrollContainer/Container/Type/TypeButton + +@export var opened_from:PunishShowcase +@export var punishment:Punishment + +const id_to_name:Dictionary = {Punishment.punishment_types.BAN:"BAN", + Punishment.punishment_types.MUTE:"MUTE"} + +signal changed + +func _ready() -> void: + close_requested.connect(close) + donebutton.pressed.connect(done) + delete_button.pressed.connect(delete_this) + for type in Punishment.punishment_types: + type_button.add_item(type) + +func delete_this(): + if opened_from: + opened_from.queue_free() + punishment = null + hide() + delete_check.button_pressed = false + changed.emit() + +func _process(delta: float) -> void: + delete_button.disabled = !delete_check.button_pressed + +func update(set_time:bool = false): + if !punishment: + printerr("!punishment is true") + return + name_edit.text = punishment.username + uid_edit.text = punishment.uid + reason_edit.text = punishment.punish_reason + var from_time:int = punishment.punish_end + var from_unix:Dictionary = Time.get_date_dict_from_unix_time(from_time) + @warning_ignore("integer_division") + var years:int = from_unix["year"] + @warning_ignore("integer_division") + var days:int = from_unix["day"] + years_edit.value = years + days_edit.value = days + type_button.select(punishment.what_punishment) + changed.emit() + +func close(): + punishment = null + opened_from = null + delete_check.button_pressed = false + hide() + changed.emit() + +func done(): + if opened_from: + opened_from.punishment = get_punish() + opened_from.update() + hide() + else: + hide() + delete_check.button_pressed = false + changed.emit() + +func get_punish() -> Punishment: + var new_punishment:Punishment = Punishment.new() + new_punishment.username = name_edit.text + new_punishment.uid = uid_edit.text + new_punishment.punish_reason = reason_edit.text + var time:int = 0 + time += years_edit.value * 31536000 + time += days_edit.value *86400 + var unixtime:float = Time.get_unix_time_from_datetime_dict({"year":years_edit.value, + "day":days_edit.value,}) + new_punishment.punish_end = unixtime + new_punishment.what_punishment = type_button.selected + changed.emit() + return new_punishment diff --git a/scenes/windwos/edit_window.gd.uid b/scenes/windwos/edit_window.gd.uid new file mode 100644 index 0000000..361ee07 --- /dev/null +++ b/scenes/windwos/edit_window.gd.uid @@ -0,0 +1 @@ +uid://n41mlonj47n3 diff --git a/scenes/windwos/edit_window.tscn b/scenes/windwos/edit_window.tscn new file mode 100644 index 0000000..adb0a9b --- /dev/null +++ b/scenes/windwos/edit_window.tscn @@ -0,0 +1,143 @@ +[gd_scene format=3 uid="uid://dy18m2uq557to"] + +[ext_resource type="Script" uid="uid://n41mlonj47n3" path="res://scenes/windwos/edit_window.gd" id="1_827p1"] + +[sub_resource type="LabelSettings" id="LabelSettings_827p1"] +font_size = 14 +font_color = Color(0.7581918, 0.7581918, 0.7581917, 1) + +[node name="EditWindow" type="Window" unique_id=1215629639] +oversampling_override = 1.0 +initial_position = 4 +size = Vector2i(680, 395) +visible = false +force_native = true +script = ExtResource("1_827p1") + +[node name="ColorRect" type="ColorRect" parent="." unique_id=207830370] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0.32941177, 0.25490198, 0.1764706, 1) + +[node name="margin" type="MarginContainer" parent="." unique_id=81777967] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_constants/margin_left = 5 +theme_override_constants/margin_top = 5 +theme_override_constants/margin_right = 5 +theme_override_constants/margin_bottom = 5 + +[node name="VBoxContainer" type="VBoxContainer" parent="margin" unique_id=565613909] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Label" type="Label" parent="margin/VBoxContainer" unique_id=725988158] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Edit Punishment" + +[node name="HSeparator" type="HSeparator" parent="margin/VBoxContainer" unique_id=155976402] +layout_mode = 2 + +[node name="ScrollContainer" type="ScrollContainer" parent="margin/VBoxContainer" unique_id=7819980] +layout_mode = 2 +size_flags_vertical = 3 + +[node name="Container" type="VBoxContainer" parent="margin/VBoxContainer/ScrollContainer" unique_id=505332829] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="Name" type="HBoxContainer" parent="margin/VBoxContainer/ScrollContainer/Container" unique_id=2031494707] +layout_mode = 2 + +[node name="Name Label" type="Label" parent="margin/VBoxContainer/ScrollContainer/Container/Name" unique_id=579407327] +layout_mode = 2 +text = "Name:" + +[node name="Name Edit" type="LineEdit" parent="margin/VBoxContainer/ScrollContainer/Container/Name" unique_id=716298584] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="UID" type="HBoxContainer" parent="margin/VBoxContainer/ScrollContainer/Container" unique_id=211366043] +layout_mode = 2 + +[node name="UID Label" type="Label" parent="margin/VBoxContainer/ScrollContainer/Container/UID" unique_id=1644730935] +layout_mode = 2 +text = "UID:" + +[node name="UID Edit" type="LineEdit" parent="margin/VBoxContainer/ScrollContainer/Container/UID" unique_id=946656979] +layout_mode = 2 +size_flags_horizontal = 3 +draw_control_chars = true + +[node name="Type" type="HBoxContainer" parent="margin/VBoxContainer/ScrollContainer/Container" unique_id=301450437] +layout_mode = 2 + +[node name="Type" type="Label" parent="margin/VBoxContainer/ScrollContainer/Container/Type" unique_id=10941001] +layout_mode = 2 +text = "Type:" + +[node name="TypeButton" type="OptionButton" parent="margin/VBoxContainer/ScrollContainer/Container/Type" unique_id=2091379963] +layout_mode = 2 + +[node name="Reason" type="HBoxContainer" parent="margin/VBoxContainer/ScrollContainer/Container" unique_id=420802158] +layout_mode = 2 + +[node name="Reason Label" type="Label" parent="margin/VBoxContainer/ScrollContainer/Container/Reason" unique_id=675845905] +layout_mode = 2 +text = "Reason:" + +[node name="Reason Edit" type="LineEdit" parent="margin/VBoxContainer/ScrollContainer/Container/Reason" unique_id=194738986] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="Ends" type="HBoxContainer" parent="margin/VBoxContainer/ScrollContainer/Container" unique_id=594016585] +layout_mode = 2 + +[node name="Ends Label" type="Label" parent="margin/VBoxContainer/ScrollContainer/Container/Ends" unique_id=1648518427] +layout_mode = 2 +text = "Ends on:" + +[node name="DaysEdit" type="SpinBox" parent="margin/VBoxContainer/ScrollContainer/Container/Ends" unique_id=1346908939] +layout_mode = 2 +size_flags_horizontal = 3 +max_value = 364.0 +prefix = "day " + +[node name="YearsEdit" type="SpinBox" parent="margin/VBoxContainer/ScrollContainer/Container/Ends" unique_id=467960707] +layout_mode = 2 +size_flags_horizontal = 3 +min_value = 1970.0 +max_value = 1000000.0 +value = 1970.0 +allow_greater = true +prefix = "year" + +[node name="Label2" type="Label" parent="margin/VBoxContainer/ScrollContainer/Container" unique_id=9299148] +layout_mode = 2 +text = "keep all at 0 for an infinite ban." +label_settings = SubResource("LabelSettings_827p1") + +[node name="DeleteCheck" type="CheckBox" parent="margin/VBoxContainer/ScrollContainer/Container" unique_id=1640369628] +layout_mode = 2 +text = "Do you want to delete this punishment?" + +[node name="DeleteButton" type="Button" parent="margin/VBoxContainer/ScrollContainer/Container" unique_id=150626956] +layout_mode = 2 +size_flags_horizontal = 0 +text = "Delete" +alignment = 0 + +[node name="Done" type="Button" parent="margin/VBoxContainer" unique_id=1829409858] +layout_mode = 2 +text = "Done" diff --git a/scenes/windwos/more_options_window.gd b/scenes/windwos/more_options_window.gd new file mode 100644 index 0000000..f076542 --- /dev/null +++ b/scenes/windwos/more_options_window.gd @@ -0,0 +1,18 @@ +class_name MoreOptionsWindow extends Window + +@export var dupe_clear_button: Button +@export var save_v_1_button: Button + +signal remove_dupes +signal save_v_one +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + save_v_1_button.pressed.connect(save_v_one.emit) + dupe_clear_button.pressed.connect(remove_dupes.emit) + close_requested.connect(close) + +func close(): + hide() +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + pass diff --git a/scenes/windwos/more_options_window.gd.uid b/scenes/windwos/more_options_window.gd.uid new file mode 100644 index 0000000..5bcc261 --- /dev/null +++ b/scenes/windwos/more_options_window.gd.uid @@ -0,0 +1 @@ +uid://cgr5yq35l0u65 diff --git a/scenes/windwos/statistics.tscn b/scenes/windwos/statistics.tscn new file mode 100644 index 0000000..7f98b64 --- /dev/null +++ b/scenes/windwos/statistics.tscn @@ -0,0 +1,91 @@ +[gd_scene format=3 uid="uid://gah2g6nabyf4"] + +[ext_resource type="Script" uid="uid://dwc8m0l6he4uo" path="res://scenes/windwos/StatisticsWindow.gd" id="1_nsh46"] +[ext_resource type="PackedScene" uid="uid://bv4mvou68l2sk" path="res://scenes/windwos/altshowcse.tscn" id="2_5eyo7"] + +[node name="Statistics" type="Window" unique_id=1932979201 node_paths=PackedStringArray("total", "alts", "unique", "best", "altshowcse_container")] +oversampling_override = 1.0 +initial_position = 4 +size = Vector2i(536, 390) +visible = false +force_native = true +script = ExtResource("1_nsh46") +total = NodePath("MarginContainer/TabContainer/Stats/VBoxContainer/Total") +alts = NodePath("MarginContainer/TabContainer/Stats/VBoxContainer/alts") +unique = NodePath("MarginContainer/TabContainer/Stats/VBoxContainer/Unique") +best = NodePath("MarginContainer/TabContainer/Stats/VBoxContainer/best") +altshowcse = ExtResource("2_5eyo7") +altshowcse_container = NodePath("MarginContainer/TabContainer/Leaderboard/ScrollContainer/Container") + +[node name="ColorRect" type="ColorRect" parent="." unique_id=121481691] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +color = Color(0.28358635, 0.30315065, 0.06554975, 1) + +[node name="MarginContainer" type="MarginContainer" parent="." unique_id=21771767] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_constants/margin_left = 5 +theme_override_constants/margin_top = 5 +theme_override_constants/margin_right = 5 +theme_override_constants/margin_bottom = 5 + +[node name="TabContainer" type="TabContainer" parent="MarginContainer" unique_id=870918671] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +current_tab = 1 + +[node name="Stats" type="Control" parent="MarginContainer/TabContainer" unique_id=1161969781] +visible = false +layout_mode = 2 +metadata/_tab_index = 0 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/TabContainer/Stats" unique_id=1730227224] +layout_mode = 0 +offset_right = 40.0 +offset_bottom = 40.0 + +[node name="Total" type="Label" parent="MarginContainer/TabContainer/Stats/VBoxContainer" unique_id=1786141427] +layout_mode = 2 +text = "Total punishments:" + +[node name="alts" type="Label" parent="MarginContainer/TabContainer/Stats/VBoxContainer" unique_id=874615516] +layout_mode = 2 +text = "thereof alts:" + +[node name="Unique" type="Label" parent="MarginContainer/TabContainer/Stats/VBoxContainer" unique_id=44141892] +layout_mode = 2 +text = "unique entires:" + +[node name="best" type="Label" parent="MarginContainer/TabContainer/Stats/VBoxContainer" unique_id=1010711371] +layout_mode = 2 +text = "Best evader(most alts):" + +[node name="Leaderboard" type="Control" parent="MarginContainer/TabContainer" unique_id=166474110] +layout_mode = 2 +metadata/_tab_index = 1 + +[node name="ScrollContainer" type="ScrollContainer" parent="MarginContainer/TabContainer/Leaderboard" unique_id=1207491017] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Container" type="VBoxContainer" parent="MarginContainer/TabContainer/Leaderboard/ScrollContainer" unique_id=1822273302] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +alignment = 2 diff --git a/search.gd b/search.gd new file mode 100644 index 0000000..4205f0d --- /dev/null +++ b/search.gd @@ -0,0 +1,20 @@ +extends Node + +@export var search_bar:LineEdit +@export var punish_container:Node + +func _ready() -> void: + search_bar.text_changed.connect(update) + +func update(text:String): + if text: + for child in punish_container.get_children(): + if child is PunishShowcase: + if (text.to_lower() in child.name_label.text.to_lower()) or (text.to_lower() in child.uid_label.text.to_lower()): + child.show() + else: + child.hide() + else: + for child in punish_container.get_children(): + if child is PunishShowcase: + child.show() diff --git a/search.gd.uid b/search.gd.uid new file mode 100644 index 0000000..d4e77d8 --- /dev/null +++ b/search.gd.uid @@ -0,0 +1 @@ +uid://bt5wd8qjaevk0 diff --git a/speaker.png b/speaker.png new file mode 100644 index 0000000..564a685 Binary files /dev/null and b/speaker.png differ diff --git a/speaker.png.import b/speaker.png.import new file mode 100644 index 0000000..cacc797 --- /dev/null +++ b/speaker.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cbq650vxvsxw1" +path="res://.godot/imported/speaker.png-045bf6684b83b55b088824f14e175d16.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://speaker.png" +dest_files=["res://.godot/imported/speaker.png-045bf6684b83b55b088824f14e175d16.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/tf2logo.png b/tf2logo.png new file mode 100644 index 0000000..e79dfcf Binary files /dev/null and b/tf2logo.png differ diff --git a/tf2logo.png.import b/tf2logo.png.import new file mode 100644 index 0000000..e715de2 --- /dev/null +++ b/tf2logo.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://o2sjogt3b0ht" +path="res://.godot/imported/tf2logo.png-5b6963627dd432a7b538e7f5c69f00b3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://tf2logo.png" +dest_files=["res://.godot/imported/tf2logo.png-5b6963627dd432a7b538e7f5c69f00b3.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/todo.txt b/todo.txt new file mode 100644 index 0000000..2d1ecca --- /dev/null +++ b/todo.txt @@ -0,0 +1 @@ +Nothing! 🥣🐁