238 lines
6.5 KiB
GDScript3
238 lines
6.5 KiB
GDScript3
|
|
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
|
||
|
|
}
|