@icon("res://addons/twitcher/assets/chat-icon.svg") extends Twitcher ## Direct access to the chat for one specific channel ## ## Usefull when using multiple channels otherwise TwitchIRC has everything you need ## This one exists only for tracking user join and leave events. ## ## @deprecated: Twitch plans to remove IRC so use the eventsub solution instead class_name TwitchIrcChannel static var _log: TwitchLogger = TwitchLogger.new("TwitchIrcChannel") ## when a chat message in this channel got received signal message_received(from_user: String, message: String, tags: TwitchTags.Message) ## Sent when the bot joins a channel or sends a PRIVMSG message. signal user_state_received(tags: TwitchTags.Userstate) ## Sent when the bot joins a channel or when the channel’s chat settings change. signal room_state_received(tags: TwitchTags.Roomstate) ## Called when the bot joined the channel or atleast get the channel informations. signal has_joined() ## Called when thie bot left the channel. signal has_left() @export var twitch_service: TwitchService @export var channel_name: StringName: set = _update_channel_name, get = _get_channel_name var user_state: TwitchTags.Userstate var room_state: TwitchTags.Roomstate: set(val): room_state = val if !joined && val != null: joined = true has_joined.emit() var joined: bool var irc: TwitchIRC func _enter_tree() -> void: _enter_channel() func _get_channel_name() -> StringName: return channel_name.to_lower() func _update_channel_name(new_name: StringName) -> void: if channel_name != "": irc.remove_channel(self) channel_name = new_name _enter_channel() func _enter_channel() -> void: if irc == null: return if channel_name == &"": _log.e("No channel is specified to join. The channel name can be set on the TwitchIrcChannel node.") return irc.add_channel(self) func _ready() -> void: irc = twitch_service.irc irc.received_privmsg.connect(_on_message_received) irc.received_roomstate.connect(_on_roomstate_received) irc.received_userstate.connect(_on_userstate_received) _enter_channel() func _exit_tree() -> void: irc.remove_channel(self) func _on_message_received(channel: StringName, from_user: String, message: String, tags: TwitchTags.PrivMsg): if channel_name != channel: return var message_tag = TwitchTags.Message.from_priv_msg(tags) await message_tag.load_sprites(twitch_service) message_received.emit(from_user, message, message_tag) func _on_roomstate_received(channel: StringName, tags: TwitchTags.Roomstate): if channel != channel_name: return room_state = tags room_state_received.emit(room_state) func _on_userstate_received(channel: StringName, tags: TwitchTags.Userstate): if channel != channel_name: return user_state = tags user_state_received.emit(user_state) func chat(message: String) -> void: await is_joined() irc.chat(message, channel_name) func is_joined() -> void: if not joined: await has_joined func leave() -> void: room_state = null joined = false has_left.emit()