barebones prototype

This commit is contained in:
Tabby 2025-10-29 22:23:34 +11:00
parent 83f340ea01
commit b53d33584c
60 changed files with 3743 additions and 1 deletions

View file

@ -0,0 +1,237 @@
class_name Embed
"""
Stores data about a Discord Embed
and has functions to add, modify and edit
the various properties of an Embed.
"""
var title: String: set = set_title, get = get_title
var type: String = 'rich': set = set_type, get = get_type
var description: String: set = set_description, get = get_description
var url: String: set = set_url, get = get_url
var timestamp: String: set = set_timestamp, get = get_timestamp
var color: set = set_color, get = get_color
var footer = null
var image = null
var thumbnail = null
var video = null
var provider = null
var author = null
var fields: Array
func get_title():
return title if Helpers.is_valid_str(title) else null
func get_type():
return type if Helpers.is_valid_str(type) else null
func get_description():
return description if Helpers.is_valid_str(description) else null
func get_url():
return url if Helpers.is_valid_str(url) else null
func get_timestamp():
return timestamp if Helpers.is_valid_str(timestamp) else null
func get_color():
return color
func set_title(_title):
assert(Helpers.is_valid_str(_title), 'Invalid Type: title of Embed must be a String')
assert(_title.length() <= 256, 'title of Embed must be <= 256 characters')
title = _title
return self
func set_type(_type):
assert(Helpers.is_valid_str(_type), 'Invalid Type: type of Embed must be a String')
type = _type
return self
func set_description(_description):
assert(
Helpers.is_valid_str(_description), 'Invalid Type: description of Embed must be a String'
)
assert(_description.length() <= 4096, 'Embed description must be <= 4096 characters')
description = _description
return self
func set_url(_url):
assert(Helpers.is_valid_str(_url), 'Invalid Type: url of Embed must be a String')
url = _url
return self
func set_timestamp(_timestamp = ''):
timestamp = Helpers.make_iso_string()
return self
func set_color(_color):
# RBG color
if typeof(_color) == TYPE_ARRAY:
color = (int(_color[0]) * 256 * 256) + (int(_color[1]) * 256) + int(_color[2])
# Hex color
elif typeof(_color) == TYPE_STRING and _color.begins_with('#'):
color = _color.replace('#', '0x').hex_to_int()
# Decimal color
elif _color.is_valid_integer:
color = int(_color)
return self
func set_footer(text: String, icon_url: String = '', proxy_icon_url: String = ''):
assert(Helpers.is_valid_str(text), 'Invalid Type: footer text of Embed must be a valid String')
assert(text.length() <= 2048, 'Embed footer text must be <= 2048 characters')
footer = {'text': text, 'icon_url': icon_url, 'proxy_icon_url': proxy_icon_url}
return self
func set_image(url: String, width: int = -1, height: int = -1, proxy_url: String = ''):
assert(Helpers.is_valid_str(url), 'Invalid Type: image url of Embed must be a valid String')
image = {
'url': url,
'width': width if width != -1 else null,
'height': height if height != -1 else null,
'proxy_url': proxy_url if Helpers.is_valid_str(proxy_url) else null
}
return self
func set_thumbnail(url: String, width: int = -1, height: int = -1, proxy_url: String = ''):
assert(Helpers.is_valid_str(url), 'Embed thumbnail url must be a valid String')
thumbnail = {
'url': url,
'width': width if width != -1 else null,
'height': height if height != -1 else null,
'proxy_url': proxy_url if Helpers.is_valid_str(proxy_url) else null
}
return self
func set_video(url: String, width: int = -1, height: int = -1, proxy_url: String = ''):
assert(Helpers.is_valid_str(url), 'Invalid Type: video url of Embed must be a valid String')
video = {
'url': url,
'width': width if width != -1 else null,
'height': height if height != -1 else null,
'proxy_url': proxy_url if Helpers.is_valid_str(proxy_url) else null
}
return self
func set_provider(name: String, url: String = ''):
assert(
Helpers.is_valid_str(name), 'Invalid Type: provider name of Embed must be a valid String'
)
provider = {'name': name, 'url': url if Helpers.is_valid_str(url) else null}
return self
func set_author(
name: String, url: String = '', icon_url: String = '', proxy_icon_url: String = ''
):
assert(Helpers.is_valid_str(name), 'Invalid Type: author name of Embed must be a valid String')
assert(name.length() <= 256, 'Embed author name must be <= 256 characters')
author = {
'name': name,
'url': url if Helpers.is_valid_str(url) else null,
'icon_url': icon_url if Helpers.is_valid_str(icon_url) else null,
'proxy_icon_url': proxy_icon_url if Helpers.is_valid_str(proxy_icon_url) else null
}
return self
func add_field(name: String, value: String, inline: bool = false, index = -1):
assert(Helpers.is_valid_str(name), 'Invalid Type: field name of Embed must be a valid String')
assert(Helpers.is_valid_str(value), 'Invalid Type: field value of Embed must be a valid String')
assert(name.length() <= 256, 'Embed field name must be <= 256 characters')
assert(value.length() <= 1024, 'Embed field value must be <= 1024 characters')
assert(fields.size() <= 25, 'Embed can have a max of 25 fields')
var new_field = {'name': name, 'value': value, 'inline': inline}
if index == -1:
fields.append(new_field)
else:
fields.insert(index, new_field)
return self
func slice_fields(index: int, delete_count: int = 1, replace_fields: Array = []):
var n = fields.size()
assert(Helpers.is_num(index), 'Missing index must be provided to Embed.slice_fields')
assert(index > -1 and index < n, 'index out of bounds in Embed.slice_fields')
var max_deletable = n - index
assert(delete_count <= max_deletable, 'delete_count out of bounds in Embed.slice_fields')
while delete_count != 0:
fields.remove_at(index)
delete_count -= 1
if replace_fields.size() != 0:
# add fields
for field in replace_fields:
var inline = false
if field.size() == 3:
inline = field[2]
add_field(field[0], field[1], inline, index)
index += 1
return self
func _to_string(pretty: bool = false) -> String:
return JSON.stringify(_to_dict(), '\t') if pretty else JSON.stringify(_to_dict())
func print():
print(_to_string(true))
func _to_dict() -> Dictionary:
var total = title + description
if footer and footer.text:
total += footer.text
if author and author.name:
total += author.name
for field in fields:
total += field.name
total += field.value
total = str(total).length()
assert(total <= 6000, 'Embed content must be <= 6000 characters in total')
return {
'title': title,
'type': type,
'description': description,
'url': url,
'timestamp': timestamp,
'color': color,
'footer': footer,
'image': image,
'thumbnail': thumbnail,
'video': video,
'provider': provider,
'author': author,
'fields': fields
}