shine-runners-test/example/ChatContainer.gd

62 lines
2.2 KiB
GDScript3
Raw Normal View History

2025-04-21 00:17:07 +10:00
class_name VSTChatContainer extends VBoxContainer
var msg_node: PackedScene = preload("res://example/ChatMessage.tscn")
@onready var scroll_container = $Chat/ScrollContainer
@onready var chat_message_container = $Chat/ScrollContainer/ChatMessageContainer
func _ready():
VerySimpleTwitch.chat_message_received.connect(create_chatter_msg)
func create_chatter_msg(chatter: VSTChatter):
var msg: VSTChatMessage = msg_node.instantiate()
var badges: String = await get_badges(chatter)
chatter.message = escape_bbcode(chatter.message)
await add_emotes(chatter)
var bottom: bool = is_scroll_bottom()
msg.set_chatter_msg(badges, chatter)
chat_message_container.add_child(msg)
await get_tree().process_frame
if bottom: scroll_container.scroll_vertical = scroll_container.get_v_scroll_bar().max_value
func get_badges(chatter: VSTChatter) -> String:
var badges:= ""
for badge in chatter.tags.badges:
var result = await VerySimpleTwitch.get_badge(badge, \
chatter.tags.badges[badge], chatter.tags.user_id)
if result:
badges += "[img=center]" + result.resource_path + "[/img] "
return badges
func add_emotes(chatter: VSTChatter):
if chatter.tags.emotes.is_empty(): return
var locations: Array = []
for emote in chatter.tags.emotes:
for data in chatter.tags.emotes[emote].split(","):
var start_end = data.split("-")
locations.append(VSTEmoteLocation.new(emote, int(start_end[0]), int(start_end[1])))
locations.sort_custom(Callable(VSTEmoteLocation, "smaller"))
var offset = 0
for loc in locations:
var result = await VerySimpleTwitch.get_emote(loc.id)
var emote_string = "[img=center]" + result.resource_path +"[/img]"
chatter.message = chatter.message.substr(0, loc.start + offset) + \
emote_string + chatter.message.substr(loc.end + offset + 1)
offset += emote_string.length() + loc.start - loc.end - 1
func is_scroll_bottom() -> bool:
return scroll_container.scroll_vertical == scroll_container.get_v_scroll_bar().max_value -\
scroll_container.get_v_scroll_bar().get_rect().size.y
# Returns escaped BBCode that won't be parsed by RichTextLabel as tags.
func escape_bbcode(bbcode_text):
return bbcode_text.replace("[", "[lb]")
func clear():
for child in chat_message_container.get_children():
chat_message_container.remove_child(child)