extends Control @onready var controls: VBoxContainer = %Controls @onready var auth_twitch: Button = %AuthTwitch @onready var auth_bot: Button = %AuthBot @onready var bot_hello: Button = %BotHello @onready var chat_history: ScrollContainer = %ChatHistory @onready var chat_list: VBoxContainer = %ChatList @onready var auto_connect: CheckBox = %AutoConnect @onready var exit_overlay: Button = %ExitOverlay #region Twitch Nodes @onready var twitcher: TwitcherExtended = $TwitcherExtended #endregion # Called when the node enters the scene tree for the first time. func _ready() -> void: Globals.twitcher = twitcher auto_connect.button_pressed = Globals.settings.auto_connect auth_twitch.pressed.connect(_handle_twitch_auth) auth_bot.pressed.connect(_handle_bot_auth) bot_hello.pressed.connect(_handle_bot_hello) twitcher.chat.message_received.connect(_handle_chat_message) get_window().mouse_entered.connect(func(): controls.visible = true) get_window().mouse_exited.connect(func(): controls.visible = false) exit_overlay.pressed.connect(func(): get_tree().quit()) auto_connect.pressed.connect(func(): Globals.settings.auto_connect = auto_connect.button_pressed) var res := twitcher.load_streamer_token() if res == TwitcherExtended.AuthStatus.UNAUTHORIZED: return if auto_connect.button_pressed: _handle_twitch_auth() res = twitcher.load_chatbot_token() if res == TwitcherExtended.AuthStatus.UNAUTHORIZED: return _handle_bot_auth() func _handle_twitch_auth() -> void: await twitcher.setup_streamer() if twitcher.is_streamer_authed(): auth_twitch.disabled = true func _handle_bot_auth() -> void: await twitcher.setup_chatbot() if twitcher.is_chatbot_authed(): auth_bot.disabled = true func _handle_bot_hello() -> void: twitcher.send_message("Hello") func _handle_chat_message(message: TwitchChatMessage) -> void: var badges_dict: Dictionary = await message.get_badges(twitcher.media) var badges: Array[SpriteFrames] = [] badges.assign(badges_dict.values()) var result_message: String = "" var badge_id: int = 0 for badge: SpriteFrames in badges: result_message += "[sprite id='0-%s']%s[/sprite]" % [badge_id, badge.resource_path] badge_id += 1 result_message += "[color=%s]%s[/color]: " % [message.get_color(), message.chatter_user_name] match message.message_type: # The default message style TwitchChatMessage.MessageType.text: result_message = await show_text(message, result_message) # When someone is using the gigantified emotes TwitchChatMessage.MessageType.power_ups_gigantified_emote: result_message = await show_text(message, result_message, 3) # When someone is using the hilight my message from channel points rewards TwitchChatMessage.MessageType.channel_points_highlighted: result_message += "[bgcolor=#755ebc][color=#e9fffb]" result_message = await show_text(message, result_message) result_message += "[/color][/bgcolor]" # When someone is using teh message effect bit reward: TwitchChatMessage.MessageType.power_ups_message_effect: result_message += "[shake rate=20.0 level=5 connected=1]" result_message = await show_text(message, result_message) result_message += "[/shake]" append_history(result_message) func append_history(message: String) -> void: var msg: RichTextLabel = RichTextLabel.new() msg.bbcode_enabled = true msg.fit_content = true var effect: SpriteFrameEffect = SpriteFrameEffect.new() msg.install_effect(effect) chat_list.add_child(msg) message = effect.prepare_message(message, msg) msg.text = "%s %s" % [_get_time(), message] await get_tree().process_frame var rect := msg.get_rect() chat_history.scroll_vertical = roundi(rect.position.y + rect.size.y) func _get_time() -> String: var time_data: Dictionary = Time.get_time_dict_from_system() return "%02d:%02d" % [time_data["hour"], time_data["minute"]] func show_text(message: TwitchChatMessage, current_text: String, emote_scale: int = 1) -> String: await message.load_emotes_from_fragment(twitcher.media) var fragment_id: int = 0 for fragment: TwitchChatMessage.Fragment in message.message.fragments: fragment_id += 1 match fragment.type: TwitchChatMessage.FragmentType.text: current_text += fragment.text TwitchChatMessage.FragmentType.cheermote: var cheermote_scale: StringName = TwitchCheermoteDefinition.SCALE_MAP.get(emote_scale, TwitchCheermoteDefinition.SCALE_1) var cheermote: SpriteFrames = await fragment.cheermote.get_sprite_frames(twitcher.media, cheermote_scale) current_text += "[sprite id='f-%s']%s[/sprite]" % [fragment_id, cheermote.resource_path] TwitchChatMessage.FragmentType.emote: var emote: SpriteFrames = await fragment.emote.get_sprite_frames(twitcher.media, emote_scale) current_text += "[sprite id='f-%s']%s[/sprite]" % [fragment_id, emote.resource_path] TwitchChatMessage.FragmentType.mention: current_text += "[color=%s]%s[/color]" % ["#00a0b6", fragment.mention.user_name] return current_text