obsws-ruby/lib/obsws/event.rb

93 lines
2.5 KiB
Ruby
Raw Permalink Normal View History

2022-10-22 22:30:40 +01:00
module OBSWS
module Events
module SUBS
NONE = 0
2022-10-27 06:45:21 +01:00
GENERAL = 1 << 0
CONFIG = 1 << 1
SCENES = 1 << 2
INPUTS = 1 << 3
TRANSITIONS = 1 << 4
FILTERS = 1 << 5
OUTPUTS = 1 << 6
SCENEITEMS = 1 << 7
MEDIAINPUTS = 1 << 8
VENDORS = 1 << 9
UI = 1 << 10
2022-10-22 22:30:40 +01:00
2022-10-27 06:45:21 +01:00
LOW_VOLUME = GENERAL | CONFIG | SCENES | INPUTS | TRANSITIONS | FILTERS | OUTPUTS |
2023-07-19 15:11:05 +01:00
SCENEITEMS | MEDIAINPUTS | VENDORS | UI
2022-10-22 22:30:40 +01:00
2022-10-27 06:45:21 +01:00
INPUTVOLUMEMETERS = 1 << 16
INPUTACTIVESTATECHANGED = 1 << 17
INPUTSHOWSTATECHANGED = 1 << 18
SCENEITEMTRANSFORMCHANGED = 1 << 19
2022-10-22 22:30:40 +01:00
2022-10-27 06:45:21 +01:00
HIGH_VOLUME = INPUTVOLUMEMETERS | INPUTACTIVESTATECHANGED | INPUTSHOWSTATECHANGED |
2023-07-19 15:11:05 +01:00
SCENEITEMTRANSFORMCHANGED
2022-10-22 22:30:40 +01:00
2022-10-27 06:45:21 +01:00
ALL = LOW_VOLUME | HIGH_VOLUME
2022-10-22 22:30:40 +01:00
end
module Director
using Util::CoreExtensions
2022-10-22 22:30:40 +01:00
2023-07-26 18:55:19 +01:00
def observers
@observers ||= {}
2023-07-26 18:55:19 +01:00
end
def on(event, method = nil, &block)
(observers[event] ||= []) << (block || method)
2022-10-22 22:30:40 +01:00
end
def register(cbs)
2023-08-29 15:45:23 +01:00
cbs = Array(cbs) unless cbs.respond_to? :each
cbs.each { |cb| on(cb.name[3..].to_sym, cb) }
2022-10-22 22:30:40 +01:00
end
def deregister(cbs)
2023-08-29 15:45:23 +01:00
cbs = Array(cbs) unless cbs.respond_to? :each
cbs.each { |cb| observers[cb.name[3..].to_sym]&.reject! { |o| cbs.include? o } }
2022-10-22 22:30:40 +01:00
end
def fire(event, data)
observers[event.snakecase.to_sym]&.each { |block| data.empty? ? block.call : block.call(data) }
end
2022-10-22 22:30:40 +01:00
end
class Client
2023-07-26 14:37:35 +01:00
include Logging
include Events::Director
2022-10-22 22:30:40 +01:00
include Mixin::TearDown
include Mixin::OPCodes
def initialize(**kwargs)
2022-10-27 06:45:21 +01:00
kwargs[:subs] ||= SUBS::LOW_VOLUME
2022-10-22 22:30:40 +01:00
@base_client = Base.new(**kwargs)
unless @base_client.identified.state == :identified
err_msg = @base_client.identified.error_message
logger.error(err_msg)
raise OBSWSConnectionError.new(err_msg)
end
2023-07-26 16:15:43 +01:00
logger.info("#{self} successfully identified with server")
rescue Errno::ECONNREFUSED, WaitUtil::TimeoutError => e
msg = "#{e.class.name}: #{e.message}"
logger.error(msg)
raise OBSWSConnectionError.new(msg)
else
@base_client.updater = ->(op_code, data) {
if op_code == Mixin::OPCodes::EVENT
2023-07-26 14:37:35 +01:00
logger.debug("received: #{data}")
event = data[:eventType]
data = data.fetch(:eventData, {})
fire(event, Mixin::Data.new(data, data.keys))
end
}
2022-10-22 22:30:40 +01:00
end
def to_s
2023-07-19 15:11:05 +01:00
self.class.name.split("::").last(2).join("::")
end
2022-10-22 22:30:40 +01:00
end
end
end