53 lines
1.7 KiB
GDScript
53 lines
1.7 KiB
GDScript
@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 = id
|
|
chatter.first_seen = Time.get_unix_time_from_system()
|
|
chatter.last_seen = chatter.first_seen
|
|
Globals.context.chatters.append(chatter)
|
|
first_seen = true
|
|
else:
|
|
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)
|