OverviewFilesCommitsIssuesDocsReleasesPeers

godot-marble_madness_demo / hypergodot / hyper_gossip / ListGossip.gd

49 lines · gd ref:
extends HyperGossip

signal list_items(items)

class_name ListGossip

export var id_key = 'url'
export var items_event = 'items'

# Enables you to gossip a list of items, useful for game lobbies
var items = []

func _ready():
	._ready()
	connect("event", self, "_on_event_list_gossip")

func add_item(item):
	if !item.has(id_key):
		printerr('Attempted to gossip item without an id key:', id_key, ' ', item)
		return
	
	if !has_item(item):
		items.append(item)
		broadcast_items()

func has_item(item):
	for existing in items:
		if existing[id_key] == item[id_key]:
			return true
	return false

func broadcast_items():
	emit_signal('list_items', items)
	broadcast_event(items_event, {'items': items})

func _on_event_list_gossip(event, data, _from):
	if event != items_event: return
	if !data.has('items'):
		printerr('Gossip without items list', data)
		return
	var hasNew = false
	for item in data.items:
		if !has_item(item):
			hasNew = true
			items.append(item)

	if hasNew: broadcast_items()