StreamOverlay/lib/chat_manager.gd

58 lines
1.9 KiB
GDScript3
Raw Normal View History

2026-02-23 18:38:03 -06:00
@tool
extends Node
signal first_seen_chat(user: TwitchUser, chatter: Chatter, msg: TwitchChatMessage)
signal first_chat(user: TwitchUser, chatter: Chatter, msg: TwitchChatMessage)
signal chat_message(user: TwitchUser, msg: TwitchChatMessage)
var chatters: Dictionary[TwitchUser, Chatter] = {}
var _log: TwitchLogger = TwitchLogger.new("ChatManager")
func _ready() -> void:
if Engine.is_editor_hint(): return
while not Globals.twitcher:
await get_tree().process_frame
Globals.twitcher.chat.message_received.connect(_handle_message)
func _handle_message(message: TwitchChatMessage) -> void:
var id := message.chatter_user_id
var user: TwitchUser
var chatter: Chatter
var first_msg: bool = false
var first_seen: bool = false
# Do we have the chatter this session?
if chatters.keys().any(func(x: TwitchUser): return x.id == id):
var res := chatters.keys().filter(func(x: TwitchUser): return x.id == id)
user = res[0]
chatter = chatters[user]
else:
user = await Globals.twitcher.get_user_by_id(id)
if not user:
_log.e("Failed to fetch user by id: %s" % [id])
return
# Do we have this chatter in our database?
chatter = Globals.context.chatters.find_one(Condition.new().equal("twitch_id", id))
if not chatter:
chatter = Chatter.new()
chatter.twitch_id = user.id
chatter.user = user
chatter.first_added = Time.get_unix_time_from_system()
chatter.first_seen = chatter.first_added
chatter.last_seen = chatter.first_added
2026-02-23 18:38:03 -06:00
Globals.context.chatters.append(chatter)
first_seen = true
else:
if chatter.first_seen == -1.0:
chatter.first_seen = Time.get_unix_time_from_system()
2026-02-23 18:38:03 -06:00
chatter.last_seen = Time.get_unix_time_from_system()
chatter.save()
first_msg = true
chatters[user] = chatter
if first_seen: first_seen_chat.emit(user, chatter, message)
if first_msg: first_chat.emit(user, chatter, message)
chat_message.emit(user, chatter, message)