Initial Commit

This commit is contained in:
Mario Steele 2026-02-23 18:38:03 -06:00
commit 48a5e71e00
1136 changed files with 64347 additions and 0 deletions

128
main_win.gd Normal file
View file

@ -0,0 +1,128 @@
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