require "json" require_relative "util" require_relative "mixin" require_relative "logger" module OBSWS module Events module SUBS NONE = 0 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 LOW_VOLUME = GENERAL | CONFIG | SCENES | INPUTS | TRANSITIONS | FILTERS | OUTPUTS | SCENEITEMS | MEDIAINPUTS | VENDORS | UI INPUTVOLUMEMETERS = 1 << 16 INPUTACTIVESTATECHANGED = 1 << 17 INPUTSHOWSTATECHANGED = 1 << 18 SCENEITEMTRANSFORMCHANGED = 1 << 19 HIGH_VOLUME = INPUTVOLUMEMETERS | INPUTACTIVESTATECHANGED | INPUTSHOWSTATECHANGED | SCENEITEMTRANSFORMCHANGED ALL = LOW_VOLUME | HIGH_VOLUME end module Callbacks include Util def observers @observers ||= [] end def add_observer(observer) observer = [observer] if !observer.respond_to? :each observer.each { |o| observers << o } end def remove_observer(observer) observers.delete(observer) end def notify_observers(event, data) observers.each do |o| if o.respond_to? "on_#{event.to_snake}" if data.empty? o.send("on_#{event.to_snake}") else o.send("on_#{event.to_snake}", data) end end end end end class Client include Logging include Callbacks include Mixin::TearDown include Mixin::OPCodes def initialize(**kwargs) kwargs[:subs] ||= SUBS::LOW_VOLUME @base_client = Base.new(**kwargs) logger.info("#{self} successfully identified with server") @base_client.updater = ->(op_code, data) { if op_code == Mixin::OPCodes::EVENT logger.debug("received: #{data}") event = data[:eventType] data = data.fetch(:eventData, {}) notify_observers(event, Mixin::Data.new(data, data.keys)) end } end def to_s self.class.name.split("::").last(2).join("::") end end end end