Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions addons/Gedis/core/gedis_core.gd
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ var _hashes: Dictionary = {}
var _lists: Dictionary = {}
var _sets: Dictionary = {}
var _sorted_sets: Dictionary = {}
var _expiry: Dictionary[String, float] = {}
var _expiry: Dictionary = {}

# Pub/Sub registries
var _subscribers: Dictionary[String, Array] = {}
Expand Down Expand Up @@ -205,4 +205,8 @@ func ks(key: String) -> String:
return "gedis:keyspace:" + key

func rks(key: String) -> String:
return key.substr("gedis:keyspace:".length())
var prefix = "gedis:keyspace:"
if key.begins_with(prefix):
return key.substr(prefix.length())
else:
return key
17 changes: 11 additions & 6 deletions addons/Gedis/core/gedis_lists.gd
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func lpop(key: String):
return null
if not _gedis._core._lists.has(key):
return null
var a: Array = _gedis._core._lists[key]
var a: Array = _gedis._core._lists[key].duplicate()
if a.is_empty():
return null
var v = a.pop_front()
Expand All @@ -53,7 +53,7 @@ func rpop(key: String):
return null
if not _gedis._core._lists.has(key):
return null
var a: Array = _gedis._core._lists[key]
var a: Array = _gedis._core._lists[key].duplicate()
if a.is_empty():
return null
var v = a.pop_back()
Expand All @@ -71,10 +71,15 @@ func llen(key: String) -> int:
var a: Array = _gedis._core._lists.get(key, [])
return a.size()

func lexists(key: String) -> bool:
if _gedis._expiry._is_expired(key):
return false
return _gedis._core._lists.has(key)

func lget(key: String) -> Array:
if _gedis._expiry._is_expired(key):
return []
return _gedis._core._lists.get(key, [])
return _gedis._core._lists.get(key, []).duplicate()

func lrange(key: String, start: int, stop: int) -> Array:
if _gedis._expiry._is_expired(key):
Expand Down Expand Up @@ -114,7 +119,7 @@ func lset(key: String, index: int, value) -> bool:
return false
if not _gedis._core._lists.has(key):
return false
var a: Array = _gedis._core._lists[key]
var a: Array = _gedis._core._lists[key].duplicate()
var n = a.size()
if index < 0:
index = n + index
Expand Down Expand Up @@ -227,7 +232,7 @@ func ltrim(key: String, start: int, stop: int) -> bool:
if not _gedis._core._lists.has(key):
return false

var a: Array = _gedis._core._lists[key]
var a: Array = _gedis._core._lists[key].duplicate()
var n = a.size()

if start < 0:
Expand Down Expand Up @@ -264,7 +269,7 @@ func linsert(key: String, position: String, pivot: Variant, value: Variant) -> i
if not _gedis._core._lists.has(key):
return 0

var a: Array = _gedis._core._lists[key]
var a: Array = _gedis._core._lists[key].duplicate()
var n = a.size()
var index = -1

Expand Down
5 changes: 5 additions & 0 deletions addons/Gedis/core/gedis_sets.gd
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,11 @@ func scard(key: String) -> int:
return 0
return _gedis._core._sets.get(key, {}).size()

func sexists(key: String) -> bool:
if _gedis._expiry._is_expired(key):
return false
return _gedis._core._sets.has(key)

func spop(key: String):
if _gedis._expiry._is_expired(key):
return null
Expand Down
12 changes: 12 additions & 0 deletions addons/Gedis/core/gedis_sorted_sets.gd
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,18 @@ func remove(key: String, member: String) -> int:
return 1
return 0

func zexists(key: String) -> bool:
if _gedis._expiry._is_expired(key):
return false
return _gedis._core._sorted_sets.has(key)

func zcard(key: String) -> int:
if _gedis._expiry._is_expired(key):
return 0
if not _gedis._core._sorted_sets.has(key):
return 0
return _gedis._core._sorted_sets[key].sorted_set.size()

# Returns a range of members from the sorted set, ordered by score.
#
# @param start: The starting index of the range.
Expand Down
18 changes: 17 additions & 1 deletion addons/Gedis/gedis.gd
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ func dbsize() -> int:
func ks(key: String) -> String:
return _core.ks(key)

## Removes the keyspace prefix of a key
## Removes the keyspace prefix from a key if present, otherwise returns the key unchanged
func rks(key: String) -> String:
return _core.rks(key)

Expand Down Expand Up @@ -236,6 +236,10 @@ func rpop(key: String):
func llen(key: String) -> int:
return _lists.llen(key)

## Checks if a list exists.
func lexists(key: String) -> bool:
return _lists.lexists(key)

## Gets all elements from a list.
func lget(key: String) -> Array:
return _lists.lget(key)
Expand Down Expand Up @@ -289,6 +293,10 @@ func sismember(key: String, member) -> bool:
func scard(key: String) -> int:
return _sets.scard(key)

## Checks if a set exists.
func sexists(key: String) -> bool:
return _sets.sexists(key)

## Removes and returns a random member from a set.
func spop(key: String):
return _sets.spop(key)
Expand Down Expand Up @@ -330,6 +338,14 @@ func srandmember(key: String, count: int = 1) -> Variant:
func zadd(key: String, member: String, score: int):
return _sorted_sets.add(key, member, score)

## Checks if a sorted set exists.
func zexists(key: String) -> bool:
return _sorted_sets.zexists(key)

## Gets the number of members in a sorted set.
func zcard(key: String) -> int:
return _sorted_sets.zcard(key)

## Removes a member from a sorted set.
func zrem(key: String, member: String):
return _sorted_sets.remove(key, member)
Expand Down
2 changes: 1 addition & 1 deletion addons/Gedis/plugin.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@
name="Gedis"
description="Redis-like in-memory key-value store for Godot"
author="NodotProject"
version="0.1.8"
version="0.1.9"
script="plugin.gd"
icon="icon.png"
67 changes: 67 additions & 0 deletions addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
@tool
extends VBoxContainer

# UI references will be set from the scene
@export var queues_tree: Tree
@export var jobs_tree: Tree
@export var job_details_text: TextEdit
@export var refresh_button: Button

var plugin

func _ready() -> void:
if refresh_button:
refresh_button.pressed.connect(_on_refresh_pressed)

# Set column titles for the queues tree
queues_tree.set_column_titles_visible(true)
queues_tree.set_column_title(0, "Queue")
queues_tree.set_column_title(1, "Jobs")

# Set column titles for the jobs tree
jobs_tree.set_column_titles_visible(true)
jobs_tree.set_column_title(0, "ID")
jobs_tree.set_column_title(1, "Queue")
jobs_tree.set_column_title(2, "Status")

func set_plugin(p) -> void:
plugin = p

func _on_refresh_pressed() -> void:
if plugin:
# This assumes the main dashboard has an instance selector
var selected_id = get_parent().get_parent().instance_selector.get_item_id(get_parent().get_parent().instance_selector.selected)
var session_id = plugin.get_current_session_id()
if session_id != -1:
plugin._fetch_keys_for_selected_instance(session_id)

func update_queues(data: Dictionary) -> void:
queues_tree.clear()
var root = queues_tree.create_item()
queues_tree.hide_root = true

for queue_name in data:
var queue_item = queues_tree.create_item(root)
queue_item.set_text(0, queue_name)
queue_item.set_text(1, str(data[queue_name].size()))

func update_jobs(jobs: Array) -> void:
jobs_tree.clear()
var root = jobs_tree.create_item()
jobs_tree.hide_root = true

for job in jobs:
var job_item = jobs_tree.create_item(root)
job_item.set_text(0, job.id)
job_item.set_text(1, job.queue_name)
job_item.set_text(2, job.status)
job_item.set_meta("data", job.data)

func _on_jobs_tree_item_selected() -> void:
var selected_item = jobs_tree.get_selected()
if selected_item:
job_details_text.text = selected_item.get_meta("data")

func _on_queues_tree_item_selected() -> void:
# TODO: should filter out jobs not the selected queue
pass
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
uid://c5fv5yw1cok24
48 changes: 48 additions & 0 deletions addons/GedisQueue/debugger/gedis_queue_debugger_panel.tscn
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
[gd_scene load_steps=2 format=3 uid="uid://b5h5h5h5h5h5"]

[ext_resource type="Script" uid="uid://c5fv5yw1cok24" path="res://addons/GedisQueue/debugger/gedis_queue_debugger_panel.gd" id="1_abcde"]

[node name="GedisQueueDebuggerPanel" type="VBoxContainer" node_paths=PackedStringArray("queues_tree", "jobs_tree", "job_details_text", "refresh_button")]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
script = ExtResource("1_abcde")
queues_tree = NodePath("HSplitContainer/QueuesTree")
jobs_tree = NodePath("HSplitContainer/JobsVBox/JobsTree")
job_details_text = NodePath("HSplitContainer/JobsVBox/JobDetailsText")
refresh_button = NodePath("RefreshButton")

[node name="RefreshButton" type="Button" parent="."]
layout_mode = 2
text = "Refresh Queues"

[node name="HSplitContainer" type="HSplitContainer" parent="."]
layout_mode = 2
size_flags_vertical = 3

[node name="QueuesTree" type="Tree" parent="HSplitContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_stretch_ratio = 0.3
columns = 2
column_titles_visible = true
select_mode = 1

[node name="JobsVBox" type="VBoxContainer" parent="HSplitContainer"]
layout_mode = 2
size_flags_horizontal = 3

[node name="JobsTree" type="Tree" parent="HSplitContainer/JobsVBox"]
layout_mode = 2
size_flags_vertical = 3
columns = 3
column_titles_visible = true
select_mode = 1

[node name="JobDetailsText" type="TextEdit" parent="HSplitContainer/JobsVBox"]
layout_mode = 2
size_flags_vertical = 3
editable = false

[connection signal="item_selected" from="HSplitContainer/QueuesTree" to="." method="_on_queues_tree_item_selected"]
[connection signal="item_selected" from="HSplitContainer/JobsVBox/JobsTree" to="." method="_on_jobs_tree_item_selected"]
2 changes: 1 addition & 1 deletion addons/GedisQueue/plugin.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
name="GedisQueue"
description="A BullMQ-like queue system for Godot, backed by Gedis."
author="NodotProject"
version="0.1.8"
version="0.1.9"
script="plugin.gd"
85 changes: 85 additions & 0 deletions addons/GedisQueue/plugin.gd
Original file line number Diff line number Diff line change
@@ -1,2 +1,87 @@
@tool
extends EditorPlugin

const GedisQueueDebuggerPanel = preload("res://addons/GedisQueue/debugger/gedis_queue_debugger_panel.tscn")

var queue_debugger_plugin
var queue_panel
var dashboard

func _enter_tree():
queue_debugger_plugin = GedisQueueDebuggerPlugin.new()
add_debugger_plugin(queue_debugger_plugin)

var timer = Timer.new()
timer.wait_time = 1
timer.timeout.connect(_on_timer_timeout)
add_child(timer)
timer.start()

func _on_timer_timeout():
var editor_node = EditorInterface.get_base_control()
dashboard = editor_node.find_child("Gedis", true, false)

if dashboard:
var debugger = dashboard.plugin
if debugger:
var tab_container = dashboard.find_child("TabContainer", true, false)
if tab_container:
queue_panel = dashboard.find_child("Queue", true, false)
if !queue_panel:
queue_panel = GedisQueueDebuggerPanel.instantiate()
queue_panel.name = "Queue"
tab_container.add_child(queue_panel)
queue_panel.set_plugin(debugger)

var session_id = debugger.get_current_session_id()
if session_id != -1:
queue_debugger_plugin.set_queue_panel(session_id, queue_panel)


func _exit_tree():
if queue_debugger_plugin:
remove_debugger_plugin(queue_debugger_plugin)
queue_debugger_plugin = null
if queue_panel:
queue_panel.queue_free()

class GedisQueueDebuggerPlugin extends EditorDebuggerPlugin:
var queue_panels = {}

func set_queue_panel(session_id, panel):
queue_panels[session_id] = panel

func _has_capture(capture):
return capture == "gedis"

func _capture(message, data, session_id):
var parts = message.split(":")
var kind = parts[1] if parts.size() > 1 else ""

if session_id in queue_panels:
var queue_panel = queue_panels[session_id]
match kind:
"snapshot_data":
if queue_panel:
var snapshot = data[0]
var queues = {}
var jobs = []

for key in snapshot:
var value = snapshot[key]
if "job" in key:
var job_data = value["value"]
var key_parts = key.split(":")
if key_parts.size() > 2:
job_data["queue_name"] = key_parts[1]
jobs.append(job_data)
else:
var queue_name = key.replace("gedis_queue:", "").replace(":waiting", "").replace(":active", "")
if not queue_name in queues:
queues[queue_name] = []
queues[queue_name].append_array(value["value"])

queue_panel.update_queues(queues)
queue_panel.update_jobs(jobs)
return true
return false
4 changes: 4 additions & 0 deletions game/game.gd
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ func _on_add_job_button_pressed():
jobs_container.add_child(progress_bar)
job_nodes[job.id] = progress_bar

func _on_add_100_job_button_pressed() -> void:
for i in range(100):
_on_add_job_button_pressed()

func _on_job_completed(job: GedisJob, return_value):
if job_nodes.has(job.id):
var progress_bar = job_nodes[job.id]
Expand Down
Loading