shine-runners-test/addons/very-simple-twitch/parse_helper.gd
2025-04-21 00:17:07 +10:00

74 lines
2.4 KiB
GDScript

class_name VSTParseHelper
# Parse login name from payload substring of twitch irc chat
static func parse_login(input_string:String) -> String:
return get_substring(input_string, ":", "!")
# Parse channel name from payload substring of twitch irc chat
static func parse_channel(input_string:String) -> String:
return input_string.trim_prefix("#")
# Parse message from payload substring of twitch irc chat
static func parse_message(input_string:String) -> String:
return input_string.trim_prefix(":").strip_edges()
static func parse_tags(input_string:String) -> VSTIRCTags:
var irc_tags = VSTIRCTags.new()
var tags:PackedStringArray = input_string.split(";")
for i in len(tags):
var splitted_tag:PackedStringArray = tags[i].split("=")
if splitted_tag.size() <= 1: continue
match(splitted_tag[0].strip_edges()):
"badges":
irc_tags.badges = parse_badges(splitted_tag[1].split(","))
"color":
irc_tags.color_hex = splitted_tag[1]
"display-name":
irc_tags.display_name = splitted_tag[1]
"emotes":
irc_tags.emotes = parse_emotes(splitted_tag[1].split("/"))
"room-id":
irc_tags.user_id = splitted_tag[1]
return irc_tags
# Parse badges from payload substring of twitch irc chat. Returns a dictionary with the badge itself
# and the position of the badge
static func parse_badges(input:PackedStringArray) -> Dictionary:
var badges: Dictionary = {}
if input.is_empty() || input[0].is_empty(): return badges
for i in len(input):
var substrings = input[i].split("/")
if len(substrings) > 1:
badges[substrings[0]] = substrings[1]
return badges
# Parse emotes from payload substring of twitch irc chat. Returns a dictionary with the emote
# itself and the position in the user message in order to replace the text with the image emote
static func parse_emotes(input:PackedStringArray) -> Dictionary:
var emotes: Dictionary = {}
if input.is_empty() || input[0].is_empty(): return emotes
for emote in input:
var substring: PackedStringArray = emote.split(":")
if len(substring) > 1:
emotes[substring[0]] = substring[1]
return emotes
static func get_substring(input_string:String, starting_char:String, ending_char:String) -> String:
var first_index = input_string.find(starting_char)
var last_index = input_string.find(ending_char)
if first_index == -1 or last_index == -1 or last_index < first_index:
return input_string
return input_string.substr(first_index + 1, last_index - first_index - 1)